|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
18.05.2011, 13:57 | #1 |
Форумчанин
Регистрация: 10.09.2009
Сообщений: 352
|
ePyGraph - графопостроитель на Python
В школе пишем графопостроитель. Уже сделал интерфейс, уже рисую графики функций. Теперь задача вот такая: нужно находить точки разрыва и корни. Точки разрыва там, где деление на ноль и корень из отрицательного числа, а корни там, где функция равна нулю (т.е. график пересекает ось ОХ).
Проблема в том, что хоть мы и идём с очень маленьким шагом (0.000001), мы можем в точку разрыва или корень и не попасть. Тогда мы спокойно нарисуем график, хотя на самом деле там асимптота. Ну или корень не вычислим. Как это реализовать? Причём с подсчётом пределов или производных функции будет проблема - у меня функцию можно задавать средствами Питона, т.е. там могут быть и условия, и циклы. Код прилагается. На Ubuntu 10.04 запускается сразу, а пользователям винды придётся помучиться - прога юзает Python 2, GTK, PyGTK и Cairo (который, впрочем, вроде вместе с GTK идёт). Последний раз редактировалось anyx; 18.05.2011 в 14:21. |
18.05.2011, 14:02 | #2 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Ну ты же можешь отследить делитель? То есть если а/b=c, то можно проверить b. Тут нужно указать некоторую величину погрешности. Например, если -0.000001<b<0.000001 то можно считать, что произошло деление на нуль. Остальные условия аналогично.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
18.05.2011, 14:21 | #3 |
Форумчанин
Регистрация: 10.09.2009
Сообщений: 352
|
Если задана такая функция:
1 / x то можно просто при переборе значений насильно добавить ноль (когда знак x сменится, например). А если, например, задана такая функция: 1 / (x**2 + 2*x - 1) то мы уже не знаем, при каком x произойдёт деление на ноль. Кстати, проблему с корнями это тоже не решает. |
18.05.2011, 14:24 | #4 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Еще как решает.
Итак - 1 / (x**2 + 2*x - 1) берем а=1, b=(x**2 + 2*x - 1) затем проверяем b, условия в предыдущем посте. Если все ОК значит делим, иначе не судьба.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
18.05.2011, 17:01 | #5 | |
Участник клуба
Регистрация: 04.04.2010
Сообщений: 1,554
|
anyx
Цитата:
|
|
19.05.2011, 06:56 | #6 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Язык здесь не при чем. Просто товарищ не все сказал, подразумевая, что все и так понятно и кругом одни питонисты. Например оконный интерфейс через glade...
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
19.05.2011, 14:02 | #7 | |
Форумчанин
Регистрация: 10.09.2009
Сообщений: 352
|
Цитата:
Дельного ответа пока нет. Utkin, ещё раз объясняю. В функции 1 / (x ** 2 + 1) мы понятия не имеем, достигнет ли выражение в скобках нуля. Нет, конечно, знаем, что не достигнет, но чтобы объяснить это интерпретатору, придётся делать обратный разбор выражения, т.е. решать уравнение x**2 + 1 = 0. Это само по себе сложно, да ещё и к встроенным функциям (sin, cos, tan... , lg и т.д.) придётся базу данных области определения составлять. Машинные вычисления неточны (да, Utkin, ты можешь кичиться своим Scheme, где вычисления максимально точны, но я прогаю на Питоне), и мы не можем точно сказать, будет ли x**2 + 2*x - 1 равно нуль при данном x, т.к. из-за потери точности оно случайно либо будет равно, либо нет, при x равном корню соответствующего уравнения. Последний раз редактировалось anyx; 19.05.2011 в 14:06. |
|
19.05.2011, 15:33 | #8 | |
Участник клуба
Регистрация: 04.04.2010
Сообщений: 1,554
|
anyx
Цитата:
|
|
19.05.2011, 15:38 | #9 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Да можем мы все. Просто для этого тебе придется не передавать выражение из строки готовой функции, а разбирать его самостоятельно. Ну если уже совсем не в моготу, то скармливать выражение по частям...
Ты же можешь выделить из операции деления делитель? Вот и проверь его.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Utkin; 19.05.2011 в 15:42. |
20.05.2011, 11:18 | #10 |
Форумчанин
Регистрация: 10.09.2009
Сообщений: 352
|
, и вправду, лень. Прогаю только на уроках, дома не хочу тратить время.
Вы, возможно, не поняли, но я искал варианты без разбора выражения. А если с разбором - я и сам понимаю, как это реализовать. Была одна мысль - если производная очень большая по модулю (т.е. abs(delta_y / delta_x) > xxx, где xxx - некоторое значение (зависящее от delta_x), с которого график функции с такой производной на отрезке можно считать вертикальным), то тут точка разрыва. O_o! Кажется, это вполне сносное решение. Оно не пройдёт на ОЧЕНЬ хитрых функциях, но нам сказали, что таких не будет. Вот, додумался сам. Если бы я писал на С, то было бы также. Но если бы я писал коммерческое приложение (не важно, на Питоне или на С), то я бы сделал удобный инсталлятор, чтобы пользователь не мучился. Последний раз редактировалось anyx; 20.05.2011 в 11:27. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
python | eohim | Фриланс | 0 | 04.05.2011 13:50 |
Python-twitter | Levsha100 | Свободное общение | 1 | 14.12.2010 08:19 |
Python + GAE | Mag992 | PHP | 1 | 20.10.2010 17:04 |
Python | Astron | Свободное общение | 1 | 31.03.2010 23:11 |
Графопостроитель | alll_23 | Общие вопросы Delphi | 5 | 12.12.2007 13:36 |