Как найти производную в c
Перейти к содержимому

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

  • автор:

Как найти производную?
Примеры решений

Как найти производную, как взять производную? На данном уроке мы научимся находить производные функций. Но перед изучением данной страницы я настоятельно рекомендую ознакомиться с методическим материалом Горячие формулы школьного курса математики. Справочное пособие можно открыть или закачать на странице Математические формулы и таблицы. Также оттуда нам потребуется Таблица производных, ее лучше распечатать, к ней часто придется обращаться, причем, не только сейчас, но и в оффлайне.

Есть? Приступим. У меня для Вас есть две новости: хорошая и очень хорошая. Хорошая новость состоит в следующем: чтобы научиться находить производные, совсем не обязательно знать и понимать, что такое производная. Более того, определение производной функции, математический, физический, геометрический смысл производной целесообразнее переварить позже, поскольку качественная проработка теории, по моему мнению, требует изучения ряда других тем, а также некоторого практического опыта.
И сейчас наша задача освоить эти самые производные технически. Очень хорошая новость состоит в том, что научиться брать производные не так сложно, существует довольно чёткий алгоритм решения (и объяснения) этого задания, интегралы или пределы, например, освоить труднее.

Советую следующий порядок изучения темы: во-первых, эта статья. Затем нужно прочитать важнейший урок Производная сложной функции. Эти два базовых занятия позволят поднять Ваши навыки с полного нуля. Далее можно будет ознакомиться с более сложными производными в статье Сложные производные. Логарифмическая производная. Если планка окажется слишком высока, то сначала прочитайте вещь Простейшие типовые задачи с производной. Помимо нового материала, на уроке рассмотрены другие, более простые типы производных, и есть прекрасная возможность улучшить свою технику дифференцирования. Кроме того, в контрольных работах почти всегда встречаются задания на нахождение производных функций, которые заданы неявно или параметрически. Такой урок тоже есть: Производные неявных и параметрически заданных функций.

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

Собственно, сразу рассмотрим пример:

Найти производную функции

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

Говоря совсем просто, для того чтобы найти производную функции, нужно по определенным правилам превратить её в другую функцию. Посмотрите еще раз на таблицу производных – там функции превращаются в другие функции. Единственным исключением является экспоненциальная функция , которая превращается сама в себя. Операция нахождения производной называется дифференцированием.

Обозначения: Производную обозначают или .

ВНИМАНИЕ, ВАЖНО! Забыть поставить штрих (там, где надо), либо нарисовать лишний штрих (там, где не надо) – ГРУБАЯ ОШИБКА! Функция и её производная – это две разные функции!

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

производную константы:
, где – постоянное число;

производную степенной функции:
, в частности: , , .

Зачем запоминать? Данные знания являются элементарными знаниями о производных. И если Вы не сможете ответить преподавателю на вопрос «Чему равна производная числа?», то учеба в ВУЗе может для Вас закончиться (лично знаком с двумя реальными случаями из жизни). Кроме того, это наиболее распространенные формулы, которыми приходится пользоваться практически каждый раз, когда мы сталкиваемся с производными.

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

В этой связи переходим к рассмотрению правил дифференцирования:

1) Постоянное число можно (и нужно) вынести за знак производной

, где – постоянное число (константа)

Найти производную функции

Смотрим в таблицу производных. Производная косинуса там есть, но у нас .

Самое время использовать правило, выносим постоянный множитель за знак производной:

А теперь превращаем наш косинус по таблице:

Ну и результат желательно немного «причесать» – ставим минус на первое место, заодно избавляясь от скобок:

2) Производная суммы равна сумме производных

Найти производную функции

Решаем. Как Вы, наверное, уже заметили, первое действие, которое всегда выполняется при нахождении производной, состоит в том, что мы заключаем в скобки всё выражение и ставим штрих справа вверху:

Применяем второе правило:

Обратите внимание, что для дифференцирования все корни, степени нужно представить в виде , а если они находятся в знаменателе, то переместить их вверх. Как это сделать – рассмотрено в моих методических материалах.

Теперь вспоминаем о первом правиле дифференцирования – постоянные множители (числа) выносим за знак производной:

Обычно в ходе решения эти два правила применяют одновременно (чтобы не переписывать лишний раз длинное выражение).

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

Можно всё оставить в таком виде, так как штрихов больше нет, и производная найдена. Тем не менее, подобные выражения обычно упрощают:

Все степени вида желательно снова представить в виде корней, степени с отрицательными показателями – сбросить в знаменатель. Хотя этого можно и не делать, ошибкой не будет.

Найти производную функции

Попробуйте решить данный пример самостоятельно (ответ в конце урока). Желающие также могут воспользоваться интенсивным курсом в pdf-формате, который особенно актуален, если у вас в распоряжении совсем мало времени.

3) Производная произведения функций

Вроде бы по аналогии напрашивается формула …., но неожиданность состоит в том, что:

Это необычное правило (как, собственно, и другие) следует из определения производной. Но с теорией мы пока повременим – сейчас важнее научиться решать:

Найти производную функции

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

Сложно? Вовсе нет, вполне доступно даже для чайника.

Найти производную функции

В данной функции содержится сумма и произведение двух функций – квадратного трехчлена и логарифма . Со школы мы помним, что умножение и деление имеют приоритет перед сложением и вычитанием.

Здесь всё так же. СНАЧАЛА мы используем правило дифференцирования произведения:

Теперь для скобки используем два первых правила:

В результате применения правил дифференцирования под штрихами у нас остались только элементарные функции, по таблице производных превращаем их в другие функции:

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

Найти производную функции

Это пример для самостоятельного решения (ответ в конце урока)

4) Производная частного функций

В потолке открылся люк, не пугайся, это глюк.
А вот это вот суровая действительность:

Найти производную функции

Чего здесь только нет – сумма, разность, произведение, дробь…. С чего бы начать?! Есть сомнения, нет сомнений, но, В ЛЮБОМ СЛУЧАЕ для начала рисуем скобочки и справа вверху ставим штрих:

Теперь смотрим на выражение в скобках, как бы его упростить? В данном случае замечаем множитель, который согласно первому правилу целесообразно вынести за знак производной:

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

Смотрим на наше выражение в скобках. У нас есть сложение, вычитание и деление. Со школы мы помним, что деление выполняется в первую очередь. И здесь – сначала применяем правило дифференцирования частного:

Таким образом, наша страшная производная свелась к производным двух простых выражений. Применяем первое и второе правило, здесь это сделаем устно, надеюсь, Вы уже немного освоились в производных:

Штрихов больше нет, задание выполнено.

На практике обычно (но не всегда) ответ упрощают «школьными» методами:

Найти производную функции

Это пример для самостоятельного решения (ответ в конце урока).

Время от времени встречаются хитрые задачки:

Найти производную функции

Смотрим на данную функцию. Здесь снова дробь. Однако перед тем как использовать правило дифференцирования частного (а его можно использовать), всегда имеет смысл посмотреть, а нельзя ли упростить саму дробь, или вообще избавиться от нее?
Дело в том, что формула достаточно громоздка, и применять ее совсем не хочется.

В данном случае можно почленно поделить числитель на знаменатель.
Преобразуем функцию:

Ну вот, совсем другое дело, теперь дифференцировать просто и приятно:

Найти производную функции

Здесь ситуация похожа, превратим нашу дробь в произведение, для этого поднимем экспоненту в числитель, сменив у показателя знак:

Произведение все-таки дифференцировать проще:

Найти производную функции

Это пример для самостоятельного решения (ответ в конце урока).

5) Производная сложной функции

Данное правило также встречается очень часто. Но о нём рассказать можно очень много, поэтому я создал отдельный урок на тему Производная сложной функции.

Пример 4: . В ходе решения данного примера следует обратить внимание, на тот факт, что и – постоянные числа, не важно чему они равны, важно, что это — константы. Поэтому выносится за знак производной, а .

Автор: Емелин Александр

Блог Емелина Александра

(Переход на главную страницу)

© Copyright mathprofi.ru, Александр Емелин, 2010-2024. Копирование материалов сайта запрещено

Вычисление производных с помощью шаблонов на С++

Навеяно постом. Попутно получилось что-то похожее на собственную реализацию лямбда-выражений 🙂 С возможностью вычисления производной еще на этапе компиляции. Для задания функции можно использовать операторы +, -, *, /, а также ряд стандартных математических функций.
Sqr — возведение в квадрат
Sqrt — квадратный корень
Pow — возведение в действительную степень
Exp — показательная функция
Log — логарифм
Sin, Cos, Tg, Ctg, Asin, Acos, Atg, Actg — тригонометрия

Производная вычисляется с помощью функции derivative. На входе у нее — функтор, на выходе — тоже. Для того, чтобы производная была вычислена точно, на вход должен подаваться функтор, заданный с помощью особого синтаксиса. Синтаксис — интуитивно понятный (по крайней мере, я на это надеюсь). Если на вход derivative подать любой другой функтор или лямбду с подходящей сигнатурой (double -> double), то производная будет вычислена приближенно.
Пример:

#include #include "CrazyMath.h" using namespace std; using namespace CrazyMath; auto global = Tg(X) + Ctg(X) + Asin(X) * Acos(X) - Atg(X) / Actg(X); auto d_global = derivative(global); int main() < auto f1 = (Pow(X, 3) + 2 * Sqr(X) - 4 * X + 1 / Sqrt(1 - Sqr(X))) * (Sin(X) + Cos(X) * (Log(5, X) - Exp(2, X))); auto f2 = derivative(f1) * Sqrt(X - Tg(X / 4)); auto f3 = [](double x) ->double < return sin(x); >; auto df1 = derivative(f1); auto df2 = derivative(f2); auto df3 = derivative(f3); cout

Работает это так:

// CrazyMath.h, отрывок //--------------------------------------------------- // base functions class Const < public: typedef Const Type; Const(double x) : m_const(x) <>double operator()(double) <> private: double m_const; >; class Simple < public: typedef Simple Type; double operator()(double x) < return x; >>; template class Add < public: typedef typename AddType; Add(const F1& f1, const F2& f2) : m_f1(f1), m_f2(f2) <> double operator()(double x) < return m_f1(x) + m_f2(x); >F1 m_f1; F2 m_f2; >; //--------------------------------------------------- // helpers template Add operator+(const F1& f1, const F2& f2) < return Add(f1, f2); > template Add operator+(double value, const F& f) < return Add(f, Const(value)); > template Add operator+(const F& f, double value) < return Add(f, Const(value)); > // other helpers . //--------------------------------------------------- // derivatives template class Derivative < public: Derivative(const F& f, double dx = 1e-3) : m_f(f), m_dx(dx) <>double operator()(double x) < return (m_f(x + m_dx) - m_f(x)) / m_dx; >F m_f; double m_dx; typedef std::function Type; Type expression() < return [this](double x) ->double < return (m_f(x + m_dx) - m_f(x)) / m_dx; >; > >; template<> class Derivative  < public: typedef Const Type; Derivative(Const) <> double operator()(double) < return 0; >Type expression() < return Const(0); >>; template<> class Derivative  < public: typedef Const Type; Derivative(Simple) <> double operator()(double) < return 1; >Type expression() < return Const(1); >>; template class Derivative < Add> < public: Derivative< Add> (const Add& f) : m_df1(f.m_f1), m_df2(f.m_f2) < >double operator()(double x) < return m_df1(x) + m_df2(x); >Derivative m_df1; Derivative m_df2; typedef typename Add Type; Type expression() < return m_df1.expression() + m_df2.expression(); >>; // other derivatives . template typename Derivative::Type derivative(F f) < return Derivative(f).expression(); > extern Simple X; 

Файл CrazyMath.h получился достаточно большим, поэтому полностью включать его в статью смысла нет. Те, кому интересно, могут скачать исходники с Github’а

UPD Добавил в класс Derivative метод expression и typedef соответствующий типу, который возвращает метод expression. Метод expression возвращает функтор, пригодный для дальнейшего дифференцирования. Однако при вычислении производных 2-го, 3-го и более высоких порядков размер выражения быстро растет, поэтому компиляция может затянуться.

Как получить производную от выражения

Author24 — интернет-сервис помощи студентам

Есть выражение вроде » sin(x^3) + x». хотелось бы узнать как от этого выражения взять производную во время выполнения программы. Собственно такими выражениями заполнена матрица произвольного размера. Нужно получить новую матрицу где каждый элемент будет производной от одноименного выражения. Может существуют некомерчиские библиотеки для дифференцирования(будет круто если open source ) Это не обязательно должен быть С++, подойдет любой из популярных языков. или может быть где-то есть статьи с примерами реализации.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Найти производную приведённого выражения
Доброго времени суток, ДРУЗЬЯ. Помогите вычислить производную . Заранее спасибо.

Вычислить производную выражения полиномов
Только недавно начала знакомство с Mathlab, поэтому есть вопросы. Есть 3 полинома — р1(х), р2(х).

Найти производную простого выражения
Чему равна производная от корня из минус пяти икс?

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

553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,044
Апи вольфрам
2442 / 1840 / 406
Регистрация: 15.12.2013
Сообщений: 8,233

Эксперт С++

1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945

Symbolic C++. И таки open source.
С этим меня опередили, я тогда из вредности LISP посоветую. Там и производные легко выводить, и вообще для символьных математических операций оченно подходящий язык.

Эксперт С++

13422 / 10694 / 6385
Регистрация: 18.12.2011
Сообщений: 28,551
Почему Вы делаете из дифференцирования проблему:

1 2 3 4 5 6 7 8 9
double f(double x) { return sin(x*x*x)+x; } double diff(double x) { const double h=1e-10; return (f(x+h)-f(x-h))/(2.0*h); }

Регистрация: 16.10.2014
Сообщений: 34

ЦитатаСообщение от zss Посмотреть сообщение

Почему Вы делаете из дифференцирования проблему

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

Эксперт С++

13422 / 10694 / 6385
Регистрация: 18.12.2011
Сообщений: 28,551
Зачем для каждого? Если хотите использовать любое имя функции, то напишите так

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include #include using namespace std; double Myf(double x) {return sin(x*x*x)+x;} double diff(double x, double f(double x)) { const double h=1e-10; return (f(x+h)-f(x-h))/(2.0*h); } int main() { double dy=diff(0.1,Myf); coutdy; system("pause"); return 0; }

Регистрация: 16.10.2014
Сообщений: 34

ЦитатаСообщение от zss Посмотреть сообщение

Зачем для каждого?

Это численное решение. Тоесть на выходе будет число. но ведь мне производную еще нужно в матрицу записать в строковом виде.

Добавлено через 1 минуту
Если было х в кубе, то нужно записать 3*х в квадрате

Эксперт С++

13422 / 10694 / 6385
Регистрация: 18.12.2011
Сообщений: 28,551

ЦитатаСообщение от L-Dan Посмотреть сообщение

нужно в матрицу записать
Ну так в момент записи и вычисляйте нужное значение производной.
Регистрация: 16.10.2014
Сообщений: 34

число как ответ это частный случай производной от х в первой степени

Добавлено через 56 секунд
Вообщем простите, но это решение мне не подходит))) или я что-то не понял

Эксперт С++

13422 / 10694 / 6385
Регистрация: 18.12.2011
Сообщений: 28,551

Что-то Вы не то думаете.
Значение производной для данного значения аргумента — это тоже число, равное тангенсу наклона касательной к функции в ДАННОЙ точке.

Разница только в том, что значение dy/dx вычисляется приближенно. Чем меньше мы возьмем dx, тем более точно должно вычисляться dy. Однако, надо учесть, что числа double тоже приближенные. И при вычитании двух близких чисел может получится большая ошибка.

Регистрация: 16.10.2014
Сообщений: 34

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

Эксперт С++

13422 / 10694 / 6385
Регистрация: 18.12.2011
Сообщений: 28,551
Для второй производной получается

1 2 3 4
double diff2(double x) { return (f(x+h)-2.*f(x)+f(x-h))/(h*h); }

f — Это исходная функция, для которой нужны первая и вторая производные.
2778 / 1931 / 570
Регистрация: 05.06.2014
Сообщений: 5,595

ЦитатаСообщение от zss Посмотреть сообщение

Почему Вы делаете из дифференцирования проблему:

Если исходная функция известна заранее, это уже будет задача не на программирование, а на алгебру за одиннадцатый класс. Считаем производную на бумажке, вбиваем в код и вуаля, никакого численного дифференцирования вообще не надо. ТС же, как я понимаю, надо дифференцирование произвольной функции. Впрочем, это парсер+все та же алгебра за одиннадцатый класс.

4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28

ЦитатаСообщение от L-Dan Посмотреть сообщение

Здравствуйте. Есть выражение вроде » sin(x^3) + x»
Кто-то там из вредности Лисп рекомендовал? .

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
(printLn "Символьное дифференцирование:") (defn op-1 (op a) (cons op (cons a nil))) (defn op-2 (op a1 a2) (def r (cons op (cons a1 (cons a2 nil)))) (cond (eq? '+ op) (cond (eq? 0 a1) a2 (eq? 0 a2) a1 r) (eq? '- op) (cond (eq? 0 a2) a1 r) (eq? '* op) (cond (eq? 0 a1) 0 (eq? 0 a2) 0 (eq? 1 a1) a2 (eq? 1 a2) a1 r) (eq? '/ op) (cond (eq? 0 a1) 0 (eq? 0 a2) '. (eq? 1 a2) a1 r) (eq? '^ op) (cond (eq? 0 a1) 1 (eq? 1 a1) a2 r) )) (defn +-op (op l) (def r (filter (lambda (x) (not (eq? 0 x))) (map deriv l))) (cond (null? r) 0 (cons op r))) (defn deriv (l) (cond (atom? l) (cond (eq? 'x l) 1 0) ( (def f (car l)) (def a (cdr l)) (def a1 (car a)) (def a2 (car (cdr a))) (cond (eq? 'x f) 1 (eq? '+ f) (+-op '+ a) (eq? '- f) (+-op '- a) (eq? '^ f) (op-2 '* (op-2 '* a1 (op-2 '^ (- a1 1) a2)) (deriv a2)) (eq? '* f) (op-2 '+ (op-2 '* (deriv a1) a2) (op-2 '* a1 (deriv a2))) (eq? '/ f) (op-2 '/ (op-2 '- (op-2 '* (deriv a1) a2) (op-2 '* a1 (deriv a2))) (op-2 '^ 2 a2)) (cond (eq? 'x a1) (der-elf f 'x) (op-2 '* (deriv a1) (der-elf f a1))) )))) (defn der-elf (f x) (cond (eq? 'sin f) (op-1 'cos x) (eq? 'cos f) (append '(- 0) (in-list (op-1 'sin x))) '. )) (defn deriv-n (n l) (ntimes n deriv l)) (def f '(+ (sin (^ 3 x)) x)) (printLn "Функция " f) (printLn "1-я производная " (deriv-n 1 f)) (printLn "2-я производная " (deriv-n 2 f)) (printLn "3-я производная " (deriv-n 3 f))
Символьное дифференцирование: Функция (+ (sin (^ 3 x)) x) 1-я производная (+ (* (* 3 (^ 2 x)) (cos (^ 3 x))) 1) 2-я производная (+ (+ (* (* 3 (* 2 x)) (cos (^ 3 x))) (* (* 3 (^ 2 x)) (* (* 3 (^ 2 x)) (- 0 sin (^ 3 x)))))) 3-я производная (+ (+ (+ (* (* 3 2) (cos (^ 3 x))) (* (* 3 (* 2 x)) (* (* 3 (^ 2 x)) (- 0 sin (^ 3 x))))) (+ (* (* 3 (* 2 x)) (* (* 3 (^ 2 x)) (- 0 sin (^ 3 x)))) (* (* 3 (^ 2 x)) (+ (* (* 3 (* 2 x)) (- 0 sin (^ 3 x))) (* (* 3 (^ 2 x)) (- (* 3 (^ 2 x)))))))))

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

Есть задача:
Написать программу, которая реализует подбор значений с целью поиска максимального значения второй производной. Требуемое значение может быть найдено путем проверки промежуточных значений функции (или первой / второй производной). Следует использовать указатель на функцию, для которого определить typedef. Исходный код должен быть разделен на две единицы трансляции. Первая единица трансляции будет представлена ​​заголовочным файлом и файлом реализации. Определение typedef, а также прототип функции поиска нужного значения, должны быть расположены в заголовочном файле. Определение этой функции следует осуществить в файле реализации. Функция для проверки работоспособности программы, а также функция main (), должны быть расположены в другой единице трансляции.
Функция для тестирования может быть произвольной.
Не долго раздумывая, взял y = x^2

// file main.cpp #include "stdafx.h" #include #include "derivative.h" using namespace std; double parabola(double x) < return pow(x, 2); >void main() < printf("%.8f\n", firstDerivative(parabola, 2)); >// file derivative.h #pragma once #ifndef DERIVATIVE_H #define DERIVATIVE_H typedef double(*parabolaPointer)(double); double firstDerivative(parabolaPointer f, double); #endif // file derivative.cpp #include "stdafx.h" #include "derivative.h" #pragma once double firstDerivative(parabolaPointer f, double x, double deltaX = 0.0000001) < return (f(x + deltaX) - f(x)) / deltaX; >

Производную считаю по формуле y'(x) = (y(x + Δx) — y(x)) / Δx
Если я вместо х, подставляю 2, то считает оно правильно. Выводит 4.0000009

Обгуглив все, что можно на тему как найти вторую производную, я ничего не нашел. Разве что на cyberforum.ru было что-то связанное с производными высших порядков.

double Numerator = (f(x + deltaX) - f(x0 + deltaX)) / ((x + deltaX) - (x0 + deltaX)) - (f(x) - f(x0)) / (x - x0); double secondDerivative = Numerator / deltaX; 

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *