Как найти производную в c

от admin

Нахождение производной

Есть задача:
Написать программу, которая реализует подбор значений с целью поиска максимального значения второй производной. Требуемое значение может быть найдено путем проверки промежуточных значений функции (или первой / второй производной). Следует использовать указатель на функцию, для которого определить 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 <\Delta x>>, $» />

Например исследовал для функции $ f(x) = x^2 + x + 1 $

Написал программу.
Первую производную считает всегда почти правильно.
А со второй проблемы.
При $ EPS = 0.01 $был вывод на экран: $ 43 \quad 13.01\quad 2$
При $ EPS = 0.000001 $был вывод на экран: $ 43\quad 13\quad 2.01084$
При $ EPS = 0.0000001$вывод: $ 43\quad 13\quad 2.13163$
При $ EPS = 0.00000001$вывод: $ 43\quad 13\quad -71.0543$, -71 то откуда
При $ EPS = 0.000000001$вывод: $ 43\quad 13\quad -7105.43$,
При $ EPS = 0.0000000001$вывод: $43\quad 13\quad 0$,
При $ EPS = 0.00000000001$вывод: $43\quad 13.0001\quad 0$
При $ EPS = 0.00000000000001$вывод: $43\quad 12.7898\quad 0$

Я понимаю, конечно, вычислительная погрешность там, округления при вычислении.
Но почему при точности <img decoding=.01$» /> он посчитал точнее, чем при <img decoding=.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 ) ;
}

Я понимаю, конечно, вычислительная погрешность там, округления при вычислении.
Но почему при точности <img decoding=.01$» /> он посчитал точнее, чем при <img decoding=.00000001$» />

Справедливости ради, ТС использует long double , который в большинстве случаев реализован как 80-битное число с плавающей точкой, т.е. у мантиссы имеется порядка 19 значащих десятичных цифр.

Я бы сказал проще. Вычитание вещественных чисел одного знака и сложение чисел разных знаков $\text<--->$» /> это самые неприятные операции в компьютерной арифметике. Погрешности в случае их использования для операндов с близкими абсолютными значениями могут быть катастрофическими.</p>
<p>Я на это не обратил внимания. Там действительно на два-три порядка лучше, и семидесяти быть действительно не должно — в худшем случае порядка единицы. Единственно, что могу предположить — что где-то в промежутке вклинивается обычный восьмибайтовый тип (ну, скажем, в эпсилоне).</p>
<h2>Как найти производную функции с помощью c</h2>
<p>можно ли найти производную функции с помощью программы на Си. Я использую matlab в том, что он имеет встроенную функцию diff (), которая может быть использована для поиска производной функции.</p>
<div style=

можно ли найти производную от вышеуказанной функции с помощью c. Каков алгоритм для этого?

5 ответов

Да, это вполне возможно. Однако решение зависит от ваших потребностей. Если вам нужно простое численное решение, сделаем следующее (в определенной степени, с некоторыми ограничениями-наивная реализация):

для более продвинутых численное расчеты, вы можете использовать научная библиотека GNU.

однако, если вам нужно analitically найти формула производной данной функции, то вы кому:

  1. проанализируйте входную формулу для некоторого абстрактного типа данных, например AST;
  2. выведите его, используя идентификаторы и правила деривации (их всего несколько, эта часть должна быть самой простой),
  3. Сериализуйте абстрактный тип данных, полученный в результате процесса деривации, в строку и выведите его в результате.

однако вам не нужно будет делать все это; есть большие математические библиотеки 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.

Похожие статьи