Нахождение производной
Есть задача:
Написать программу, которая реализует подбор значений с целью поиска максимального значения второй производной. Требуемое значение может быть найдено путем проверки промежуточных значений функции (или первой / второй производной). Следует использовать указатель на функцию, для которого определить typedef. Исходный код должен быть разделен на две единицы трансляции. Первая единица трансляции будет представлена заголовочным файлом и файлом реализации. Определение typedef, а также прототип функции поиска нужного значения, должны быть расположены в заголовочном файле. Определение этой функции следует осуществить в файле реализации. Функция для проверки работоспособности программы, а также функция main (), должны быть расположены в другой единице трансляции.
Функция для тестирования может быть произвольной.
Не долго раздумывая, взял y = x^2
Производную считаю по формуле y'(x) = (y(x + Δx) — y(x)) / Δx
Если я вместо х, подставляю 2, то считает оно правильно. Выводит 4.0000009
Обгуглив все, что можно на тему как найти вторую производную, я ничего не нашел. Разве что на cyberforum.ru было что-то связанное с производными высших порядков.
Только что-то считает оно как-то неправильно.
Спросив у лектора помощи, он сказал, не имеет права помогать с заданиями. Добавил только, что в этом задании мне, для начала, нужно найти формулу нахождения второй производной, потом найти несколько производных на неком интервале и занести их в вектор. В цикле пройтись по вектору и найти максимальное значение. С этим я справлюсь, мой вопрос, кто-нибудь может, пожалуйста, помочь с нахождением второй производной либо хотя бы есть какая-то формула?
Научный форум dxdy
Последний раз редактировалось Katmandu 27.04.2014, 12:06, всего редактировалось 1 раз.
Необходимо посчитать значение второй производной в точке.
Я так понимаю что
< \frac
Например исследовал для функции 
Написал программу.
Первую производную считает всегда почти правильно.
А со второй проблемы.
При
был вывод на экран: 
При
был вывод на экран: 
При
вывод: 
При
вывод:
, -71 то откуда
При
вывод:
,
При
вывод:
,
При
вывод: 
При
вывод: 
Я понимаю, конечно, вычислительная погрешность там, округления при вычислении.
Но почему при точности
.01$» /> он посчитал точнее, чем при
.00000001$» />
#define EPS 0.00000001
long double diff ( long double ( * f ) ( long double ) , long double ) ;
long double diff2 ( long double ( * f ) ( long double ) , long double X ) ;
long double diff ( long double ( * f ) ( long double ) , long double X )
{
return ( ( f ( X + EPS ) — f ( X ) ) / EPS ) ;
}
long double diff2 ( long double ( * f ) ( long double ) , long double X )
{
return ( diff ( f,X + EPS ) — diff ( f,X ) ) / EPS ;
}
Использовал другой метод взятия производной. И точность производных стала выше при практически при любом приближении.
long double diff ( long double ( * f ) ( long double ) , long double X )
{
return ( f ( X + EPS ) — f ( X — EPS ) ) / ( 2 * EPS ) ;
}
long double diff2 ( long double ( * f ) ( long double ) , long double X )
{
return ( diff ( f,X + EPS ) — diff ( f,X — EPS ) ) / ( 2 * EPS ) ;
}
Я понимаю, конечно, вычислительная погрешность там, округления при вычислении.
Но почему при точности
.01$» /> он посчитал точнее, чем при
.00000001$» />
Справедливости ради, ТС использует long double , который в большинстве случаев реализован как 80-битное число с плавающей точкой, т.е. у мантиссы имеется порядка 19 значащих десятичных цифр.
Я бы сказал проще. Вычитание вещественных чисел одного знака и сложение чисел разных знаков 
можно ли найти производную от вышеуказанной функции с помощью c. Каков алгоритм для этого?
5 ответов
Да, это вполне возможно. Однако решение зависит от ваших потребностей. Если вам нужно простое численное решение, сделаем следующее (в определенной степени, с некоторыми ограничениями-наивная реализация):
для более продвинутых численное расчеты, вы можете использовать научная библиотека GNU.
однако, если вам нужно analitically найти формула производной данной функции, то вы кому:
- проанализируйте входную формулу для некоторого абстрактного типа данных, например AST;
- выведите его, используя идентификаторы и правила деривации (их всего несколько, эта часть должна быть самой простой),
- Сериализуйте абстрактный тип данных, полученный в результате процесса деривации, в строку и выведите его в результате.
однако вам не нужно будет делать все это; есть большие математические библиотеки C, которые обеспечить такую функциональность.
Edit: после некоторого гугления я не смог найти его. Самое близкое решение для начала работы, которое я могу придумать, — это взглянуть на исходный код GeoGebra — хотя он написан на Java, его довольно легко прочитать для любого, кто достаточно свободно владеет языком C-like. Если нет, просто продолжайте и реализуйте этот алгоритм самостоятельно:)
нет ничего встроенного в язык C, чтобы включить это. Вы могли бы найти числовую библиотеку, чтобы сделать это, хотя, если вы ищете в интернете, хотя я сомневаюсь, что есть что-нибудь доступное, что обеспечит символические производные. Вы можете сами кодировать приближенные числовые производные, используя прямые, обратные и/или центральные различия.
для простых функций хорошо работает следующее численное дифференцирование:
Я знаю, что опоздала, но я написал библиотеку, которая делает именно это.
Он позволяет анализировать функцию, генерируя дерево функций. Тогда вы даже можете решить его или вывести его.
В C вы можете сделать грубое численное дифференцирование относительно легко, но любой вид символического дифференцирования требует сторонней структуры или прокатки собственной.
C-это язык программирования общего назначения и низкого уровня, в отличие от Matlab, который специализируется на математических вычислениях и имеет передовые инструменты для символьных вычислений.
[C++] Производные
Какие есть приличные (хотябы адекватные) свободные библиотеки для рассчёта производных (дифферениалов) функций? Желательно с доками.
И ещё, возможно ли будет в дальнейшем безболезненно портировать приложение на оффтопик? Планируется небольшая САПР (не велосипед).

Re: [C++] Производные
Видимо, GSL. Оно есть в цигвине, и насколько я знаю, это единственная возможность использовать это в оффтопике.
Re: [C++] Производные
Благодарю, стану разбираться.
Re: [C++] Производные
Тебе аналитически или численно надо вычислить производную?
Re: [C++] Производные
На плюсах есть библиотека, которая аналитически считает производные прямо по плюсовому коду.
Re: [C++] Производные
название не помню, но найти думаю не проблема
Re: [C++] Производные
В template’ах чтоль? А производную чего она считает?

Re: [C++] Производные
>На плюсах есть библиотека, которая аналитически считает производные прямо по плюсовому коду.
Поскольку она формирует производные от функций известных на момент компиляции то смысла в ней никакой нет. Мэйтенанс проекта оно облегчить не может, т.к компилируется медленно и хрупкое как аццкий песец.
Re: [C++] Производные
> В template’ах чтоль? А производную чего она считает?
всего, в т.ч. и выражений с неизвестными ей функций — для них ты должен добавить производные
Re: [C++] Производные
> Поскольку она формирует производные от функций известных на момент компиляции то смысла в ней никакой нет. Мэйтенанс проекта оно облегчить не может, т.к компилируется медленно и хрупкое как аццкий песец.
1. производные от неизвестных функций никто в здравом уме компилятором считать не будет
3. хотя шаблоны вообще хрупкие, это не хрупкое

Re: [C++] Производные
>производные от неизвестных функций никто в здравом уме компилятором считать не будет
Нафиг оно тогда нужно? Почему бы просто на бумажке не взять производную и не захардкодить ее?
>хотя шаблоны вообще хрупкие, это не хрупкое
Хрупкое, поскольку это шаблон а шаблоны вообще хрупкие.
Re: [C++] Производные
> Нафиг оно тогда нужно? Почему бы просто на бумажке не взять производную и не захардкодить ее?
Ну посчитай на бумажке, например, сферический оператор Лапласа от ограничения на сфере функции 0.5(x-1)^2+(y-z)^2+2(z-3)^2. Тогда уже проще посчитать в maxima/mapple и вставить в код.

Re: [C++] Производные
>Ну посчитай на бумажке, например, сферический оператор Лапласа от ограничения на сфере функции 0.5(x-1)^2+(y-z)^2+2(z-3)^2.