Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 348

/ вопрос открыт /

Здравствуйте, эксперты!
Может кто ответит конечно...

Имею строку 'y = ( x^(3+x) - sin(x) - 5)'
Как можно в ней (и других, подобных), ПРОГРАММНО выразить x?

Gooddy Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Gooddy (статус: 3-ий класс)
Вопрос отправлен: 31 мая 2011, 03:56
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 19; последнее сообщение — 6 июня 2011, 10:28; участников в обсуждении: 7.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 31 мая 2011, 06:10 [#1]:

что значит

Цитата (Gooddy):

ПРОГРАММНО выразить x
min@y™

min@y™ (статус: Доктор наук), 31 мая 2011, 08:12 [#2]:

Цитата (Мережников Андрей):

что значит

А то и значит. На входе программы, например, строка 'y = x2', а на выходе должно быть 'x = ±y1/2'.

2Аффтар: кто ж тебе такое задание-то выдал? Может быть это задание было некорректно сформулировано и/или не так понято?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 31 мая 2011, 10:44 [#3]:

Опять символьное решение уравнений... Боян!
виконання програми розпочинається з того самого мiсця, де призупинилося.

IlluminatI

IlluminatI (статус: 2-ой класс), 31 мая 2011, 16:59 [#4]:

bugmenot, почему боян? Маткад и аналоги справляются же, значит, это реально. Только сложно. Крайне сложно :)
Вадим К

Вадим К (статус: Академик), 31 мая 2011, 17:19 [#5]:

а может человеку задали решить это в маткаде?
Хотя в большинстве случаев эту задачу можно решить, если интересен не "символьный переворот", а числовой.
Для выражений пишем парсер (это достаточно классическая задача).
потом для строим таблицу соответствий x - y, то есть, фактически делаем табуляцию функции. (это вообще классическая задача).
теперь, когда нам по значению y нужно найти x, пробегам по таблице, находим диапазоны для x. а дальше методом деления пополам уточняем значения до нужной точности.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 31 мая 2011, 17:47 [#6]:

Цитата (IlluminatI):

Маткад и аналоги справляются же, значит, это реально.

Маткад с ЭТИМ не справляется! Он решает уравнения только численными методами!

Цитата (Вадим К):

Хотя в большинстве случаев эту задачу можно решить, если интересен не "символьный переворот", а числовой.

Дык, как я понял, нужно именно преобразование "y = f(x)" в "х = g(y)". По крайне мере, аффтар так сформулировал задачу. И если эта формулировка является правильной, то ответ тут один: ЭТО UNREAL.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gooddy

Gooddy (статус: 3-ий класс), 1 июня 2011, 03:00 [#7]:

-_- УСЕМ.

Короче, чтобы было проще.

Рисую график функции. Для подсчёта значений есть 3 варианта:

1. Все уравнения записываются в виде y=f(x), т.е. например
y = x^2+x+1, далее все х заменяются циферками, считается значение y для всех х и по полученным точкам строится график.
Проблемы: уравнение должно быть выражено через переменную, при быстром движении графика вверх или вниз количество точек существенно падает и он становится "ломанным", нельзя писать многие фичечки: например если выразить через y уравнение окружности, то начертится только верхняя часть.

2. Все уравнения записываются в любом виде u(y)=f(x), например sin(y)^2 = 1.2^x
далее все x и y заменяются (проверяются все комбинации). Так я тоже делал и это ещё хуже!
Во первых, может быть банальное несовпадение в 0,000001 (в левой части например получится больше на одну мильонную чем в правой), но это легко исправить (хотя тогда может начертить и лишнего!).
Во вторых, этот метод очень ресурсоёмкий. Для проверки 500х500 значений нужно подставить, посчитать и решить нужно ли рисовать дохрена значений!

Ну и последний метод, который собственно всё решает но очень сложен в реализации:

3. Имеем уравнение вида sin(x) = y^2.
Шаг 1. Выражаем через y - y = sin(x)^1/2
Шаг 2. Узнаём точки.
Шаг 3. Выражаем через х - х = arcsin(y^2)
Шаг 4. Узнаём точки.
Шаг 5. Чертим график.

Этот алгоритм в 2 раза медленнее (как минимум) чем первый но в разы быстрее чем второй, более того у него нет недостатков!

min@y меня понял сразу, спасибо.

Жаль конечно что нельзя.
А кстати, есть идеи как график нормально вывести то?
Если 3-ий метод вообще не катит, может есть ещё какой простой?
Чисти код! Чисти код! Чисти код!
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 1 июня 2011, 05:45 [#8]:

Цитата (Gooddy):

при быстром движении графика вверх или вниз

График по экрану бегает, когда его строят?
min@y™

min@y™ (статус: Доктор наук), 1 июня 2011, 08:17 [#9]:

Цитата (Gooddy):

при быстром движении графика вверх или вниз количество точек существенно падает и он становится "ломанным"

Так и быть должно, это нормально. И от этого можно избавиться, динамически снижая шаг аргумента при большом приращении функции.

Цитата (Gooddy):

например если выразить через y уравнение окружности, то начертится только верхняя часть.

Это смотря как выражать! Пусть уравнение такое:
x2 + y2 = R2
Тогда
y = ±(R2 - x2)1/2
Обрати внимание на знак "±".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gooddy

Gooddy (статус: 3-ий класс), 4 июня 2011, 01:59 [#10]:

ага, функция f(x) вернёт 2 значения? математики негодуют.
Можно конечно говорить что это не функция а уравнение (собственно так и есть), тогда всё ок)
Чисти код! Чисти код! Чисти код!
min@y™

min@y™ (статус: Доктор наук), 4 июня 2011, 12:35 [#11]:

Цитата (Gooddy):

ага, функция f(x) вернёт 2 значения? математики негодуют.

Именно 2 значения. И математики не негодуют, а курят в коридоре и кромко смеются.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Егор

Егор (статус: 10-ый класс), 4 июня 2011, 23:45 [#12]:

Цитата (min@y™):

Маткад с ЭТИМ не справляется! Он решает уравнения только численными методами!

скрин выложить? маткад решит эту задачку безо всяких численных методов.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
min@y™

min@y™ (статус: Доктор наук), 5 июня 2011, 10:57 [#13]:

Цитата (Егор):

скрин выложить? маткад решит эту задачку безо всяких численных методов.

Давай, жду с нетерпением!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 5 июня 2011, 13:04 [#14]:

Цитата (IlluminatI):

bugmenot, почему боян? Маткад и аналоги справляются же, значит, это реально. Только сложно. Крайне сложн
И это тоже уже было.
https://expert.delphi-int.ru/question/5170/
и еще десяток подобных обсуждений
и выводы всегда одни и те же.
Боян Бояныч!

Цитата (min@y™):

Маткад с ЭТИМ не справляется! Он решает уравнения только численными методами!
Вздор, уже много лет дела обстоят не так.
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 5 июня 2011, 13:25 [#15]:

Цитата (bugmenot):

Вздор, уже много лет дела обстоят не так.

Доказательства - В СТУДИЮ!!! Хочу лично в этом убедиться!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 5 июня 2011, 18:30 [#16]:

Если троим участникам, уже высказавшимся по теме, веры на слово нет - наверное будет надежнее скачать триал и убедиться самостоятельно.
виконання програми розпочинається з того самого мiсця, де призупинилося.

Егор

Егор (статус: 10-ый класс), 5 июня 2011, 19:59 [#17]:

конкретно это уравнение не имеет символьного решения. а вообще, вот тебе скриншот с символьным решением, накопанный в недрах сети:

и версия здесь совсем уж неприлично старая - ещё под винду 3.х
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
min@y™

min@y™ (статус: Доктор наук), 6 июня 2011, 08:15 [#18]:

Цитата (bugmenot):

наверное будет надежнее скачать триал и убедиться самостоятельно

Мне не нужен триал, у меня есть лицензионный маткад.

Цитата (Егор):

конкретно это уравнение не имеет символьного решения.

Почему?

Цитата (Егор):

а вообще, вот тебе скриншот с символьным решением, накопанный в недрах сети

Всё равно не верю! Фотожаба! Дайте мне mcd-файл с выражением из вопроса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 6 июня 2011, 10:28 [#19]:

Маткад умеет решать символьные выражения. Сам когда то этим пользовался. Как минимум точно умеет интегрировать и дифференцировать.
Указанный выше текст можно набрать в маткаде - должен отработать:)
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.03 сек.