LINUX.ORG.RU

производные функций


0

0

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

anonymous

Имхо тебе стоит почитать какую-нить книжку по численным методам. Или в интернете поискать...

Caesar
()

алгЕбра, 10-й класс - значение производной ф-ции y=f(x) при x=x0, есть 
значение tg A, где А - угол под которым касательная к функции в точке
(x0,y) пересекает ось 0x. 

PETER ★★
()

2PETER ну и чего, ну тангенс и что дальше ? 8*x1*x2 - sin^2(x1-x2) и из всего этого корень кубический. вот решика это с точностью до 0,001 по методу Ньютона. решил ? а теперь все это изобрази в виде программы ! мне фендументальные понятия и определения втюхивать не надо, что такое производная и как все это решается без тебя знаю. мне нужно написать алшоритм решения на си, причем более менее гибкий для метода Ньютона. я и сам могу тупо перекатать решенную задачу с бумаги в си и забить все формулы преобразования. но это будет прога для решения конкретной задачи а не реализация метода Ньютона.

anonymous
()

Здесь вам товарисч форум по разработке под линух, а не библиотека готовых математических решений, знаете как решить математически, точнее численно, как было указано Caesar, да еще с Вашим непревзойденным умением все это переложить на С - действуйте. Замечу лишь, что в С оператора производной нет.

PETER ★★
()

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

anonymous
()

mozhno postroit' spline, tam esstestvennym obrazom proizvodnaya poluchaetsya, algoritmy dostupny

libo esli sam ne mozhesh' pol'zuy biblioteki matematicheskie tipa tam libgsl libgpm idt. v obschem google tebya spaset.

hotya v principe gde-to valyalsya kod postroeniya spline'ov.

anonymous
()

s/libgpm/libgmp/

anonymous
()

mozhno postroit' spline, tam esstestvennym obrazom proizvodnaya poluchaetsya, algoritmy dostupny

libo esli sam ne mozhesh' pol'zuy biblioteki matematicheskie tipa tam libgsl libgpm idt. v obschem google tebya spaset.

hotya v principe gde-to valyalsya kod postroeniya spline'ov.

anonymous
()

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

lg ★★
()

2lg есть система уравнений, которую требуется решить методом Ньютона. на одном из этапов решения по методу Ньютона требуется дифференцировать эти уравнения. а эти уравнения имеют весьма навороченный вид (см. выше). требуется просто найти производную в конкретной точке функции без анализа окрестнотси этой точки. в принципе пока я тут отписывал, появились некторые задумки. черт! и все-таки думается мне написать метод Ньютона для любой функции не получится, а если и получится то очень не скоро, выйдет что то в стиле маткад, и надо будет разрабатывать свой язык команд, этакий sql. проще реализовать конкретную задачу... на первых парах, а там посмотрим.

2PETER ты не серчай на меня, ну вспылил, бывает :)

в общем ладно, разгребем потихоньку, не забивайте себе голову.

anonymous
()

а что - лень посчитать производную по решетке? формула же банально выводится для O(h^n) :)

SadStork
()

2SadStork что значит по решетке ? ведь требуется не решать уравнение а вычислить производдную функции и прога должна сама уметь понимать что (x^n)'=n*x^(n-1), что (cos(x))'=-sin(x) и так далее и тому подобное, а в самой функции могут встречаться логарифны, тригонометрические функции, степени и прочая байда в произвольном порядке. Вот я сейчас и занимаюсь тем, что учу программу определять все эти синусы косинусы и логарифмы и вычислять их производные. ничего ьанального я в этом не вижу. функция не столь банальна как F(x^n), там может быть от 3 до 6 элементов и сходу взять ее производную не получится за 1-2 действие. Или ты чего, глумишься чтоль надо мной ?! :)

anonymous
()

Зря вы так сердитесь. Вплоть до последнего письма невозможно
было даже поверить, что речь идет о символическом дифференцировании.
Как говорил один мой профессор, "надо четче формулировать".

Прежде всего, не советовал бы вам морочиться с Си, а посмотреть
в сторону функциональных языков; если не ошибаюсь, ваша проблема
подробно рассмотрена в введении в ocaml где-то на inria.fr; лень
искать.

Если уж приспичило делать все на Си, то слепить парсер выражений
на lex/yacc тоже несложно (см., к примеру, Kernigan & Pike). Главное,
правильно грамматику сформулировать, остальное само собой происходит.
Если не оптимизировать, конечно.

vnp
()

Тебе как, численно или аналитически надо? Если численно - то таки да, универсального способа нет, надо как минимум знать о некоторых свойствах функции.

Antichrist
()
Ответ на: комментарий от anonymous

А, таки численно хочешь. Ну воспользуйся GSL - там всё это есть. Но я бы не советовал так поступать - когда функция явно задана аналитически, просто верх кретинизьма считать её производную численно.

Antichrist
()
Ответ на: комментарий от anonymous

Оно вообще тебе надо - на Цэ пейсать? Ты сам решил потрахаться, или тебя кто заставляет? Если последнее - пошли уродов нах, если первое - то не фиг, возьми GNU Octave и Maxima.

Antichrist
()

2vnp о! где ж ты раньше то был ? вот про это я и толкую, про символическое дифференцирование. теперь хоть буду знать, как правильно формулируется моя задача. спасибо за наводку, поковыраю lex/yacc.

anonymous
()

2Antichrist алгоритм такой: сначала на входе имею только функции в символической записи и я должен вычислить их производтные, опять таки в символическом виде. а что такое символический вид, это есть набор некторых действий представленный в виде определенных команд и констант. т.е. у меня получится некторый алгоритм записанный в символическом виде (если проводить аналогию то SQL примерно такая же штука). далее методом итераций (повторяющиеся действия) прогоняя данные через полученный символический алгоритм я получаю решение своей системы. получить конкретное решение нельзя, но можно решить систему с заданной погрешностью. чем больше я сделаю итерайций тем меньше погрешность. в результате я получу конкретную число с конкретной погрешностью (в моем случае 0,001)
если еще проще, то:
1) программа выстраивает алгоритм своих дальнейших действий на основе символически заданных функций
2) прогонать числа через полученный алгоритм, пока результат текущей итерации минус результат предыдущей итерации не будет равняться заданной погрешности, т.е. пока не получу нужную мне точность решения
на входе:
1)сиволически записанные функции
2) начальное приближение (число с которого буду начинаться итерации, хотя в принципе это число тоже можно вычислить программно, но по условию она подается на вход)
3) точность решение(погрешность)
на выходе: решение системы уравнений с заданной точностью

писать пофих на чем, но так как я не знаком с инструментарием для подобных целей, пишу на си. ну теперь то я я хоть знаю что есть алтернатива си в этом вопросе.

anonymous
()

ok, спасибо !

anonymous
()
Ответ на: комментарий от anonymous

Не надо такое писать на Си. Большей глупости и представить трудно.

Как я бы за такую задачу взялся:

вся аналитическая часть - на Maxima, она в свою очередь генерит программу на Фортране или скрипт для Octave для числодробильни. Всё просто, пишется за час-два. И не надо извращаться со своей собственной системой правил-и-стратегий, оптимизации писать, реализовывать сотни раз уже сделанные другими чметоды, и т.д.

Если же скорость особо не важна - то вообще всё делается в Maxima, буквально в пару строк кода. Смешно, правда?

Antichrist
()

антихрист, правда смешно, чтоб было еще смешнее набросай ссылок толковых про другие "считалки" имеющиеся под линух (maxima и ginac вроде тут пробегали уже) что за зверь octave? и про ocaml пожалуйста ссылок типа интродакшн плз.

anonymous
()

2Antichrist, дествительно легко, если я это все хоть раз в глаза видел. вообще то действительно, как говорил предыдущий аноним, дай пару линков почитать обо всем об этом. я б с удовольствием не заморачивался на си, но я не знаком ни с Максимой ни с чем либо другим из выше посоветованного, сейчас занимаюсь тем, что читаю описание на все это добро :-)

anonymous
()

Знаешь что такое таблица производных и правила джифференцирования? Так вот напиши несколько функций. Одна из них получает из выражения следующий логич. элемент из выражения напрмер из (lg(sin(2x+2)) вначале получишь lg, произведешь замену из таблицы производных, потом получает sin, опять заменяет, проблема наверно только с реализацией сложных ф-ций там же умножать надо.

OxiD ★★★★
()

2OxiD ага, в том то и дело, реализовать сложные функции не так уж и просто. вот например (v*u)' = v'*u + v*u'; а что если u= sin(x1)/ln(x2) а v = ln(x1)-x2 или еще что нибудь похлеще, то (v*u)' раскладывается в очень приличное выражение. простых формул преобразований не так уж и много, порядка 15. вот и требуется сначала написать движок, который раскладывает все в символичеком виде, а потом уже подставлять реальные х1 и х2

anonymous
()

На C такое лучше не писать. Помню курсе на 3 у нас была лаба по аналитическому дифференцированию на прологе и все решалось достаточно элегантно и компактно.

Декларативные языки рулят!

kpanic ★★
()
Ответ на: комментарий от anonymous

Чтоб всё в одну кучу:

http://maxima.sourceforge.net/

http://www.che.wisc.edu/octave/

http://root.cern.ch/

http://caml.inria.fr/ - читать примеры в документаловке

http://www.gnu.org/software/gsl/gsl.html

Ну и вообще полезно было бы пошугать по словам "computer algebra system", "numerical solver", и т.п.

Antichrist
()
Ответ на: комментарий от kpanic

Логики первого порядка недостаточно. Там, где достаточно лишь строгого применения ПРАВИЛ - ещё сойдёт, но вот где требуется эвристика - то есть, упрощение выражений, оптимизация алгоритмов, поиск решений - уже нужны несколько более другие свойства от языка. Частично оно есть в таких языках, как Mathematica или Maxima. Что-то можно изобразить на логике высших порядков, как в Coq...

Antichrist
()

Ну да ты прав. НО! Пиши на перле, ибо у него есть регулярные выражения с помощью которых разложить на лексемы выражение достаточно просто. И вот еще что. Посмотри исходники какого-нибудь компилятора\интерпретатора, там сто пудов есть хорошие функции и алгоритмы для парзинга выражений.

OxiD ★★★★
()

Hint: регулярные выражения есть не только в перле. Но в перле много чего нет. Вывод: не пишите на перле.

LamerOk ★★★★★
()

А говорили OCaml решит все проблемы. А как конкретная проблема вылезла - возьми Maxima + Octave (опять что-то весьма уникальное). Да. Стандартные пути не для нас. Нам бы себе проблем побольше найти.

anonymous
()
Ответ на: комментарий от anonymous

Тебе предложили способ решения задачи, и несколько ГОТОВЫЙ решений. Всё зависит от твоих целей - научиться или результат получить.

Antichrist
()
Ответ на: комментарий от anonymous

ЗЫ: и, кстати, придурь, Octave - не нечто уникальное, а тот же самый Matlab, всем давно хорошо известный. Так что засохни, гнида, и не пизди.

Antichrist
()
Ответ на: комментарий от NikZ

Хорошая. Но идиотская. Правда, ебанутому жабофилу не понять, чем лексер от парсера отличается, и что по регвырам на токены выражение разобрать - это только начало. Теперь можешь удавиться, гандон рваный.

Antichrist
()
26 декабря 2003 г.
Ответ на: комментарий от PETER

ЗАСУНЬ ФУНКЦИЮ В СВОЮ ЗАДНИЦУ И ПОСТРОЦ ЕЕ ТАМ ПО МЕТОДУ/- ВОТ МОЙ СОВЕТ

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.