Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение производных функций 
:(
    Опции темы
Гость_Сергей
Дата 9.1.2006, 21:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите пожалуйста!!!!!!!!!!!!!!!!

Я ввожу функцию(триганометрическую,простую или сложную), а на выходе должен получить её производную. smile
  Вверх
Void
Дата 9.1.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Производную нужно найти символьно, т.е. на входе что-то вроде
Цитата
3 * x ^ 2 + x * sin(2 * x)

а на выходе
Цитата
6 * x + sin(2 * x) + 2 * x * cos(2 * x)

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

В обоих случаях нужно будет делать разбор выражения. Для первого варианта обязательно в древовидное (AST) представление, и по нему создавать AST производной. Это несложно и вполне формализованно. Гораздо сложнее с упрощением полученного выражения.

Язык для реализации какой? Трудоемкость задачи от этого зависит очень сильно smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Гость_Сергей
Дата 10.1.2006, 17:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered












Delphi !!

Но что делать с более сложными (если надо найти производную 2 степени)
Цитата

f(x)''=(2*x*cosx^2)'


На выходе будет
Цитата

2*(cosx^2-2*x^2*sinx^2)


  Вверх
Void
Дата 10.1.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Цитата(Гость_Сергей @ 10.1.2006, 19:38 Найти цитируемый пост)
Но что делать с более сложными (если надо найти производную 2 степени)

Два раза продифференцировать, как ни странно smile

Повторяю: самое сложное - не взять производную, как таковую, а упростить полученное выражение.

Я бы примеров написал... Но на Delphi, к сожалению, не могу. C++/C# пойдет? (Про OCaml даже не говорю).


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Гость_Сергей
Дата 10.1.2006, 23:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered












Давай на С++ smile
  Вверх
sergejzr
Дата 10.1.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Можешь пока сюда глянуть http://forum.vingrad.ru/index.php?showtopi...st&p=431141

Там правда упрощение, но принцип тот же. Создаёшь абстрактную функцию возвращающую производную варажения.

Пишешь такие классы для каждого мат - выражения
Код

//Для суммы
class Sum extends MathObject {
   MathObject  summand1,summand2;
   MathObject diff()
   {

     return new Sum(summand1.diff(),summand2.diff());
    } 
}

//Для степени
class Pow extends MathObject {
   MathObject  base,exp;
   MathObject diff()
   {
     // X^2 возвратит (2*(X^(2-1)))
     return new Multiplication(exp, new Pow(base,new Subraction(exp,1)));
    } 
}


Потом легко:
Код

// Преобразовываем выражение 2*x*cosx^2 в обьект
MathObject Formula=new Multiplication(new Constant(2),new Multiplication(new Variable("x"),new Pow(new Variable("x"),new Constant(2))));
//И берём производную
MathObject  answer=  Formula.diff();




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Void
Дата 11.1.2006, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Ну вот, за меня уже практически все написали smile

sergej.z, одно замечание: такая реализация Pow.diff подойдет только если показатель степени - константа. В этом легко убедиться, потому что (x^x)' != (x * x ^ (x - 1))
Общая формула есть: (u ^ v)' = u ^ v * v' * ln u + v * u ^ (v - 1) * u'
но частный случай с константным показателем лучше наверное рассматривать отдельно, потому что замаемся упрощать такие выражения.
Естественно, идеального упрощения добиться практически нереально, CAS чрезвычайно сложны для реализации.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.