Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2008, 02:56   #1
heartdrive
 
Регистрация: 11.05.2008
Сообщений: 6
По умолчанию помогите с задачей! ряд тэйлора

помогите плз решить задачку!
надо разложить функцию (x-1)*sin(5*x) в ряд тэйлора по степени (x-a), a=0. программа должна выводить n членов последовательности. x,e(точность), n вводятся с клавиатуры.

никак не могу составить формулу для разложения этой функции((

Последний раз редактировалось heartdrive; 11.05.2008 в 02:59.
heartdrive вне форума Ответить с цитированием
Старый 11.05.2008, 07:37   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Как это так "не могу составить формулу"??... Разложение в ряд Тэйлора есть в любом учебнике по матану... Или с производными проблемы?
B_N вне форума Ответить с цитированием
Старый 11.05.2008, 07:51   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Кстати при а=0 это уже будет ряд Маклорена, что еще проще.
puporev вне форума Ответить с цитированием
Старый 11.05.2008, 09:36   #4
heartdrive
 
Регистрация: 11.05.2008
Сообщений: 6
По умолчанию

ага, с производными проблемы(
вот формула разложения синуса вот такая -

а эту я не знаю как разложить.
heartdrive вне форума Ответить с цитированием
Старый 11.05.2008, 09:42   #5
heartdrive
 
Регистрация: 11.05.2008
Сообщений: 6
По умолчанию

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

Пример:
Код:
{первая производная}
Function dif1(x0 : real) : real;
      begin
	  dif1 := (fx(x0 + dx) - fx(x0))/dx;
      end;

{вторая производная}
Function dif2(x0 : real) : real;
      begin
	  dif2 := (dif1(x0+dx) - dif1(x0))/dx;
      end;
ну и т.д., а общую функцию составить не получается(
heartdrive вне форума Ответить с цитированием
Старый 11.05.2008, 10:02   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А зачем Вам общая функция, если производная порядка n это производная первого порядка от производной (n-1)-го порядка? Дифференцируйте предыдущую производную, в качестве варианта без особой оптимизации, просто сделайте рекурсивную функцию в которую будете передавать порядок производной и уменьшайте его на единицу при каждом вложенном вызове. И вряд ли есть смысл синус в ряд раскладывать, если задача касается конкретной функции...
B_N вне форума Ответить с цитированием
Старый 11.05.2008, 10:34   #7
heartdrive
 
Регистрация: 11.05.2008
Сообщений: 6
По умолчанию

написала такую функцию, но она не работает все равно:

Код:
function dif(n:real):real;
var i:integer;
begin
writeln('vvedite n'); readln(n);
if n>1 then dif:=dif(dif(n-1))
       else dif:=(fx(x0+dx)-fx(x0))/dx;
end;
n задан как real чтобы можно было сделать dif(dif(n-1)), но при введении n большего единицы оно все зацикливается....
heartdrive вне форума Ответить с цитированием
Старый 11.05.2008, 11:13   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А на dx кто будет делить?
Код:
diff(x,  n)
begin
	if n > 1 then result := (diff(x + dx, n - 1) - diff(x, n - 1) ) / dx
	else result := (f(x + dx) - f(x)) / dx;
end;
B_N вне форума Ответить с цитированием
Старый 11.05.2008, 11:59   #9
heartdrive
 
Регистрация: 11.05.2008
Сообщений: 6
По умолчанию

спасибо! теперь оно заработало =)
но почему-то первые три производные вычисляет правильно, а начиная с четвертой значения неверные выводятся...
heartdrive вне форума Ответить с цитированием
Старый 11.05.2008, 13:00   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Дальше накапливаются неизбежные ошибки, связанные с ограниченной точностью машинных вещественных чисел, да и рекурсия в данном случае далеко не лучший способ. В принципе, если real заменить на extended и брать не очень мелкий dx, получается более-менее точный результат порядка до пятнадцатого, всё равно, для таких чисел Вы факториал с обычным integer не получите. Ну а для пущей точности нужно уже смотреть книжку по численным методам и аппроксимировать функцию каким-нибудь многочленом.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с задачей. terminadoor Помощь студентам 4 22.07.2008 18:38
Помогите с задачей drossel Общие вопросы C/C++ 9 01.06.2008 21:45
Помогите с задачей в С++ vovchara Помощь студентам 2 22.04.2008 22:49
Помогите с задачей Лёха Паскаль, Turbo Pascal, PascalABC.NET 7 08.02.2008 20:08
Помогите с задачей bel_ka Общие вопросы C/C++ 13 26.12.2007 19:23