Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2011, 13:57   #1
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию ePyGraph - графопостроитель на Python

В школе пишем графопостроитель. Уже сделал интерфейс, уже рисую графики функций. Теперь задача вот такая: нужно находить точки разрыва и корни. Точки разрыва там, где деление на ноль и корень из отрицательного числа, а корни там, где функция равна нулю (т.е. график пересекает ось ОХ).

Проблема в том, что хоть мы и идём с очень маленьким шагом (0.000001), мы можем в точку разрыва или корень и не попасть. Тогда мы спокойно нарисуем график, хотя на самом деле там асимптота. Ну или корень не вычислим.

Как это реализовать? Причём с подсчётом пределов или производных функции будет проблема - у меня функцию можно задавать средствами Питона, т.е. там могут быть и условия, и циклы.

Код прилагается. На Ubuntu 10.04 запускается сразу, а пользователям винды придётся помучиться - прога юзает Python 2, GTK, PyGTK и Cairo (который, впрочем, вроде вместе с GTK идёт).
Вложения
Тип файла: zip epygraph.zip (2.6 Кб, 21 просмотров)

Последний раз редактировалось anyx; 18.05.2011 в 14:21.
anyx вне форума Ответить с цитированием
Старый 18.05.2011, 14:02   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну ты же можешь отследить делитель? То есть если а/b=c, то можно проверить b. Тут нужно указать некоторую величину погрешности. Например, если -0.000001<b<0.000001 то можно считать, что произошло деление на нуль. Остальные условия аналогично.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 18.05.2011, 14:21   #3
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Если задана такая функция:
1 / x
то можно просто при переборе значений насильно добавить ноль (когда знак x сменится, например). А если, например, задана такая функция:
1 / (x**2 + 2*x - 1)
то мы уже не знаем, при каком x произойдёт деление на ноль.

Кстати, проблему с корнями это тоже не решает.
anyx вне форума Ответить с цитированием
Старый 18.05.2011, 14:24   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Еще как решает.
Итак - 1 / (x**2 + 2*x - 1)
берем а=1, b=(x**2 + 2*x - 1)
затем проверяем b, условия в предыдущем посте. Если все ОК значит делим, иначе не судьба.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 18.05.2011, 17:01   #5
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

anyx
Цитата:
а пользователям винды придётся помучиться - прога юзает Python 2, GTK, PyGTK и Cairo
АААААА!! Прелести скриптовых языков. Раздобудь все нужные библиотеки, раздобудь библиотеки для нужных библиотек, догадайся с какой версией интерпретатора они работают, ещё блин скомпилируй нативные компоненты, полазь по исходникам и найди названия внешних прог, которые вызывает скрипт, а потом догадайся в составе каких пакетов они могут быть.
the_deer_one вне форума Ответить с цитированием
Старый 19.05.2011, 06:56   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Язык здесь не при чем. Просто товарищ не все сказал, подразумевая, что все и так понятно и кругом одни питонисты. Например оконный интерфейс через glade...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 19.05.2011, 14:02   #7
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Язык здесь не при чем. Просто товарищ не все сказал, подразумевая, что все и так понятно и кругом одни питонисты. Например оконный интерфейс через glade...
Простите, но я вроде всё назвал. Поддержка glade... Разве она не по умолчанию в GTK?

Дельного ответа пока нет. 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.
anyx вне форума Ответить с цитированием
Старый 19.05.2011, 15:33   #8
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

anyx
Цитата:
и мы не можем точно сказать, будет ли x**2 + 2*x - 1 равно нуль при данном x, т.к. из-за потери точности оно случайно либо будет равно, либо нет, при x равном корню соответствующего уравнения.
А если с типом Decimal поиграться?
the_deer_one вне форума Ответить с цитированием
Старый 19.05.2011, 15:38   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Да можем мы все. Просто для этого тебе придется не передавать выражение из строки готовой функции, а разбирать его самостоятельно. Ну если уже совсем не в моготу, то скармливать выражение по частям...
Ты же можешь выделить из операции деления делитель? Вот и проверь его.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 19.05.2011 в 15:42.
Utkin вне форума Ответить с цитированием
Старый 20.05.2011, 11:18   #10
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
разбирать его самостоятельно
, и вправду, лень. Прогаю только на уроках, дома не хочу тратить время.

Вы, возможно, не поняли, но я искал варианты без разбора выражения. А если с разбором - я и сам понимаю, как это реализовать.

Была одна мысль - если производная очень большая по модулю (т.е. abs(delta_y / delta_x) > xxx, где xxx - некоторое значение (зависящее от delta_x), с которого график функции с такой производной на отрезке можно считать вертикальным), то тут точка разрыва.

O_o! Кажется, это вполне сносное решение. Оно не пройдёт на ОЧЕНЬ хитрых функциях, но нам сказали, что таких не будет. Вот, додумался сам.

Цитата:
Сообщение от the_deer_one Посмотреть сообщение
Прелести скриптовых языков
Если бы я писал на С, то было бы также. Но если бы я писал коммерческое приложение (не важно, на Питоне или на С), то я бы сделал удобный инсталлятор, чтобы пользователь не мучился.

Последний раз редактировалось anyx; 20.05.2011 в 11:27.
anyx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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