подскажите как дифференцировать функцию в си, кто нибудь подобным вопросом занимался ? знаю что универсального способа нет. но мне даже в голово не приходить с какого боку подобраться к этому вопросу.
алгЕбра, 10-й класс - значение производной ф-ции y=f(x) при x=x0, есть
значение tg A, где А - угол под которым касательная к функции в точке
(x0,y) пересекает ось 0x.
2PETER ну и чего, ну тангенс и что дальше ? 8*x1*x2 - sin^2(x1-x2) и из всего этого корень кубический. вот решика это с точностью до 0,001 по методу Ньютона. решил ? а теперь все это изобрази в виде программы ! мне фендументальные понятия и определения втюхивать не надо, что такое производная и как все это решается без тебя знаю. мне нужно написать алшоритм решения на си, причем более менее гибкий для метода Ньютона. я и сам могу тупо перекатать решенную задачу с бумаги в си и забить все формулы преобразования. но это будет прога для решения конкретной задачи а не реализация метода Ньютона.
Здесь вам товарисч форум по разработке под линух, а не библиотека готовых математических решений, знаете как решить математически, точнее численно, как было указано Caesar, да еще с Вашим непревзойденным умением все это переложить на С - действуйте. Замечу лишь, что в С оператора производной нет.
да знаю я что нет такой функции (оператора), знаю что нет функции на вход которой кидаешь строку с функцией, она ее разбирает на простейшие операции и выдает производную. знаюююю :) может что то подобное кто либо писал, нахрена мне изобретать велосипед , вот и спрашиваю, товарыш :)
2lg есть система уравнений, которую требуется решить методом Ньютона. на одном из этапов решения по методу Ньютона требуется дифференцировать эти уравнения. а эти уравнения имеют весьма навороченный вид (см. выше). требуется просто найти производную в конкретной точке функции без анализа окрестнотси этой точки. в принципе пока я тут отписывал, появились некторые задумки. черт! и все-таки думается мне написать метод Ньютона для любой функции не получится, а если и получится то очень не скоро, выйдет что то в стиле маткад, и надо будет разрабатывать свой язык команд, этакий sql. проще реализовать конкретную задачу... на первых парах, а там посмотрим.
2PETER ты не серчай на меня, ну вспылил, бывает :)
в общем ладно, разгребем потихоньку, не забивайте себе голову.
2SadStork что значит по решетке ? ведь требуется не решать уравнение а вычислить производдную функции и прога должна сама уметь понимать что (x^n)'=n*x^(n-1), что (cos(x))'=-sin(x) и так далее и тому подобное, а в самой функции могут встречаться логарифны, тригонометрические функции, степени и прочая байда в произвольном порядке. Вот я сейчас и занимаюсь тем, что учу программу определять все эти синусы косинусы и логарифмы и вычислять их производные. ничего ьанального я в этом не вижу. функция не столь банальна как F(x^n), там может быть от 3 до 6 элементов и сходу взять ее производную не получится за 1-2 действие. Или ты чего, глумишься чтоль надо мной ?! :)
Зря вы так сердитесь. Вплоть до последнего письма невозможно
было даже поверить, что речь идет о символическом дифференцировании.
Как говорил один мой профессор, "надо четче формулировать".
Прежде всего, не советовал бы вам морочиться с Си, а посмотреть
в сторону функциональных языков; если не ошибаюсь, ваша проблема
подробно рассмотрена в введении в ocaml где-то на inria.fr; лень
искать.
Если уж приспичило делать все на Си, то слепить парсер выражений
на lex/yacc тоже несложно (см., к примеру, Kernigan & Pike). Главное,
правильно грамматику сформулировать, остальное само собой происходит.
Если не оптимизировать, конечно.
Тебе как, численно или аналитически надо? Если численно - то таки да, универсального способа нет, надо как минимум знать о некоторых свойствах функции.
А, таки численно хочешь. Ну воспользуйся GSL - там всё это есть. Но я бы не советовал так поступать - когда функция явно задана аналитически, просто верх кретинизьма считать её производную численно.
Оно вообще тебе надо - на Цэ пейсать? Ты сам решил потрахаться, или тебя кто заставляет? Если последнее - пошли уродов нах, если первое - то не фиг, возьми GNU Octave и Maxima.
2vnp о! где ж ты раньше то был ? вот про это я и толкую, про символическое дифференцирование. теперь хоть буду знать, как правильно формулируется моя задача. спасибо за наводку, поковыраю lex/yacc.
2Antichrist алгоритм такой: сначала на входе имею только функции в символической записи и я должен вычислить их производтные, опять таки в символическом виде. а что такое символический вид, это есть набор некторых действий представленный в виде определенных команд и констант. т.е. у меня получится некторый алгоритм записанный в символическом виде (если проводить аналогию то SQL примерно такая же штука). далее методом итераций (повторяющиеся действия) прогоняя данные через полученный символический алгоритм я получаю решение своей системы. получить конкретное решение нельзя, но можно решить систему с заданной погрешностью. чем больше я сделаю итерайций тем меньше погрешность. в результате я получу конкретную число с конкретной погрешностью (в моем случае 0,001)
если еще проще, то:
1) программа выстраивает алгоритм своих дальнейших действий на основе символически заданных функций
2) прогонать числа через полученный алгоритм, пока результат текущей итерации минус результат предыдущей итерации не будет равняться заданной погрешности, т.е. пока не получу нужную мне точность решения
на входе:
1)сиволически записанные функции
2) начальное приближение (число с которого буду начинаться итерации, хотя в принципе это число тоже можно вычислить программно, но по условию она подается на вход)
3) точность решение(погрешность)
на выходе: решение системы уравнений с заданной точностью
писать пофих на чем, но так как я не знаком с инструментарием для подобных целей, пишу на си. ну теперь то я я хоть знаю что есть алтернатива си в этом вопросе.
Не надо такое писать на Си. Большей глупости и представить трудно.
Как я бы за такую задачу взялся:
вся аналитическая часть - на Maxima, она в свою очередь генерит программу на Фортране или скрипт для Octave для числодробильни. Всё просто, пишется за час-два. И не надо извращаться со своей собственной системой правил-и-стратегий, оптимизации писать, реализовывать сотни раз уже сделанные другими чметоды, и т.д.
Если же скорость особо не важна - то вообще всё делается в Maxima, буквально в пару строк кода. Смешно, правда?
антихрист, правда смешно, чтоб было еще смешнее набросай ссылок толковых про другие "считалки" имеющиеся под линух (maxima и ginac вроде тут пробегали уже) что за зверь octave? и про ocaml пожалуйста ссылок типа интродакшн плз.
2Antichrist, дествительно легко, если я это все хоть раз в глаза видел. вообще то действительно, как говорил предыдущий аноним, дай пару линков почитать обо всем об этом. я б с удовольствием не заморачивался на си, но я не знаком ни с Максимой ни с чем либо другим из выше посоветованного, сейчас занимаюсь тем, что читаю описание на все это добро :-)
Знаешь что такое таблица производных и правила джифференцирования? Так вот напиши несколько функций. Одна из них получает из выражения следующий логич. элемент из выражения напрмер из (lg(sin(2x+2)) вначале получишь lg, произведешь замену из таблицы производных, потом получает sin, опять заменяет, проблема наверно только с реализацией сложных ф-ций там же умножать надо.
2OxiD ага, в том то и дело, реализовать сложные функции не так уж и просто. вот например (v*u)' = v'*u + v*u'; а что если u= sin(x1)/ln(x2) а v = ln(x1)-x2 или еще что нибудь похлеще, то (v*u)' раскладывается в очень приличное выражение. простых формул преобразований не так уж и много, порядка 15. вот и требуется сначала написать движок, который раскладывает все в символичеком виде, а потом уже подставлять реальные х1 и х2
На C такое лучше не писать. Помню курсе на 3 у нас была лаба по аналитическому дифференцированию на прологе и все решалось достаточно элегантно и компактно.
Логики первого порядка недостаточно. Там, где достаточно лишь строгого применения ПРАВИЛ - ещё сойдёт, но вот где требуется эвристика - то есть, упрощение выражений, оптимизация алгоритмов, поиск решений - уже нужны несколько более другие свойства от языка. Частично оно есть в таких языках, как Mathematica или Maxima. Что-то можно изобразить на логике высших порядков, как в Coq...
Ну да ты прав. НО! Пиши на перле, ибо у него есть регулярные выражения с помощью которых разложить на лексемы выражение достаточно просто. И вот еще что. Посмотри исходники какого-нибудь компилятора\интерпретатора, там сто пудов есть хорошие функции и алгоритмы для парзинга выражений.
А говорили OCaml решит все проблемы. А как конкретная проблема вылезла - возьми Maxima + Octave (опять что-то весьма уникальное). Да. Стандартные пути не для нас. Нам бы себе проблем побольше найти.
Хорошая. Но идиотская. Правда, ебанутому жабофилу не понять, чем лексер от парсера отличается, и что по регвырам на токены выражение разобрать - это только начало. Теперь можешь удавиться, гандон рваный.