|
Вопрос # 5 348/ вопрос открыт / |
|
Здравствуйте, эксперты!
Может кто ответит конечно...
Имею строку 'y = ( x^(3+x) - sin(x) - 5)'
Как можно в ней (и других, подобных), ПРОГРАММНО выразить x?
 |
Вопрос задал: Gooddy (статус: 3-ий класс)
Вопрос отправлен: 31 мая 2011, 03:56
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 19; последнее сообщение — 6 июня 2011, 10:28; участников в обсуждении: 7.
|
min@y™ (статус: Доктор наук), 31 мая 2011, 08:12 [#2]:
Цитата (Мережников Андрей):
что значит
А то и значит. На входе программы, например, строка 'y = x2', а на выходе должно быть 'x = ±y1/2'.
2Аффтар: кто ж тебе такое задание-то выдал? Может быть это задание было некорректно сформулировано и/или не так понято?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
bugmenot (статус: 3-ий класс), 31 мая 2011, 10:44 [#3]:
Опять символьное решение уравнений... Боян!
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
IlluminatI (статус: 2-ой класс), 31 мая 2011, 16:59 [#4]:
bugmenot, почему боян? Маткад и аналоги справляются же, значит, это реально. Только сложно. Крайне сложно
|
|
Вадим К (статус: Академик), 31 мая 2011, 17:19 [#5]:
а может человеку задали решить это в маткаде?
Хотя в большинстве случаев эту задачу можно решить, если интересен не "символьный переворот", а числовой.
Для выражений пишем парсер (это достаточно классическая задача).
потом для строим таблицу соответствий x - y, то есть, фактически делаем табуляцию функции. (это вообще классическая задача).
теперь, когда нам по значению y нужно найти x, пробегам по таблице, находим диапазоны для x. а дальше методом деления пополам уточняем значения до нужной точности.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 31 мая 2011, 17:47 [#6]:
Цитата (IlluminatI):
Маткад и аналоги справляются же, значит, это реально.
Маткад с ЭТИМ не справляется! Он решает уравнения только численными методами!
Цитата (Вадим К):
Хотя в большинстве случаев эту задачу можно решить, если интересен не "символьный переворот", а числовой.
Дык, как я понял, нужно именно преобразование "y = f(x)" в "х = g(y)". По крайне мере, аффтар так сформулировал задачу. И если эта формулировка является правильной, то ответ тут один: ЭТО UNREAL.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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™ (статус: Доктор наук), 1 июня 2011, 08:17 [#9]:
Цитата (Gooddy):
при быстром движении графика вверх или вниз количество точек существенно падает и он становится "ломанным"
Так и быть должно, это нормально. И от этого можно избавиться, динамически снижая шаг аргумента при большом приращении функции.
Цитата (Gooddy):
например если выразить через y уравнение окружности, то начертится только верхняя часть.
Это смотря как выражать! Пусть уравнение такое:
x2 + y2 = R2
Тогда
y = ±(R2 - x2)1/2
Обрати внимание на знак "±".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Gooddy (статус: 3-ий класс), 4 июня 2011, 01:59 [#10]:
ага, функция f(x) вернёт 2 значения? математики негодуют.
Можно конечно говорить что это не функция а уравнение (собственно так и есть), тогда всё ок)
Чисти код! Чисти код! Чисти код!
|
|
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™ (статус: Доктор наук), 5 июня 2011, 10:57 [#13]:
Цитата (Егор):
скрин выложить? маткад решит эту задачку безо всяких численных методов.
Давай, жду с нетерпением!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
bugmenot (статус: 3-ий класс), 5 июня 2011, 13:04 [#14]:
Цитата (IlluminatI):
bugmenot, почему боян? Маткад и аналоги справляются же, значит, это реально. Только сложно. Крайне сложн И это тоже уже было.
https://expert.delphi-int.ru/question/5170/
и еще десяток подобных обсуждений
и выводы всегда одни и те же.
Боян Бояныч!
Цитата (min@y™):
Маткад с ЭТИМ не справляется! Он решает уравнения только численными методами! Вздор, уже много лет дела обстоят не так.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
min@y™ (статус: Доктор наук), 5 июня 2011, 13:25 [#15]:
Цитата (bugmenot):
Вздор, уже много лет дела обстоят не так.
Доказательства - В СТУДИЮ!!! Хочу лично в этом убедиться!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
bugmenot (статус: 3-ий класс), 5 июня 2011, 18:30 [#16]:
Если троим участникам, уже высказавшимся по теме, веры на слово нет - наверное будет надежнее скачать триал и убедиться самостоятельно.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
Егор (статус: 10-ый класс), 5 июня 2011, 19:59 [#17]:
конкретно это уравнение не имеет символьного решения. а вообще, вот тебе скриншот с символьным решением, накопанный в недрах сети:

и версия здесь совсем уж неприлично старая - ещё под винду 3.х
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
min@y™ (статус: Доктор наук), 6 июня 2011, 08:15 [#18]:
Цитата (bugmenot):
наверное будет надежнее скачать триал и убедиться самостоятельно
Мне не нужен триал, у меня есть лицензионный маткад.
Цитата (Егор):
конкретно это уравнение не имеет символьного решения.
Почему?
Цитата (Егор):
а вообще, вот тебе скриншот с символьным решением, накопанный в недрах сети
Всё равно не верю! Фотожаба! Дайте мне mcd-файл с выражением из вопроса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 6 июня 2011, 10:28 [#19]:
Маткад умеет решать символьные выражения. Сам когда то этим пользовался. Как минимум точно умеет интегрировать и дифференцировать.
Указанный выше текст можно набрать в маткаде - должен отработать
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|