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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2008, 18:06   #1
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию Ряд Тейлора, sin, cos...

Столкнулся с проблемой, нужно расчитать sin и cos вручную.

Цитата:
Ряд Тейлора: f(x) = f(a) + f'(a)(x-a) + f''(a)(x-a)^2/2! + f'''(a)(x-a)^3/3! + …

cos(x)=x-x^2/2!+ x^4/4!- x^6/6!+ x^8/8!-…
sin(x)=1-x^3/3!+ x^5/5!- x^7/7!+ x^9/9!-…
Вот что у меня получилось:

Код:
function factorial(n: integer): integer;
var
  i,c: integer;
begin
  c:=1;
  for i:=1 to n do
    c:=c*i;
  Result:=c;
end;

function _Cos(x: real): real;
var
  i: integer;
  c: real;
begin
  c:=x;
  for i:=1 to 5 do
  begin
    if odd(i) then c:=c+power(x,i*2)/factorial(i*2)
    else           c:=c-power(x,i*2)/factorial(i*2);
  end;
  Result:=c;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  form1.Caption:=floattostr(_Cos(pi));
end;

Последний раз редактировалось Kostia; 04.10.2008 в 18:09.
Kostia вне форума Ответить с цитированием
Старый 04.10.2008, 19:38   #2
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
По умолчанию

ну, и в чем вопрос?
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 04.10.2008, 20:08   #3
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Вопрос в том, что считает не правильно. Вроде все по формулам делаю.
---------
Проблема решена! Все заключалось в том, что угол должен быть на промежутке от -pi до pi, отсюда следует следующее:

Код:
function Factorial(n: word): LongInt;
var
  fact: LongInt;
begin
  fact := 1;
  if n=0 then exit;
  for n := 1 to n do
  fact := fact*n;
  Result := fact;
end;

function _Sin(x: double): double;
var
  n: integer;
  s: double;
begin

  while x>=pi do
    x:=x-pi*2;
  while x<=-pi do
    x:=x+pi*2;

  s:=x;
  for n:=1 to 4 do
  begin
    if odd(n) then s:=s-power(x,n*2+1)/factorial(n*2+1)
    else           s:=s+power(x,n*2+1)/factorial(n*2+1);
  end;
  Result:=s;
end;

function _Cos(x: double): double;
var
  n: integer;
  c: double;
begin
  while x>pi do
    x:=x-pi*2;
  while x<-pi do
    x:=x+pi*2;

  c:=1;
  for n:=1 to 4 do
  begin
    if odd(n) then c:=c-power(x,n*2)/factorial(n*2)
    else           c:=c+power(x,n*2)/factorial(n*2);
  end;
  Result:=c;
end;

Последний раз редактировалось Kostia; 04.10.2008 в 20:26.
Kostia вне форума Ответить с цитированием
Старый 04.10.2008, 20:46   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Все заключалось в том, что угол должен быть на промежутке от -pi до pi,
Вообще-то функции cosx и sinx определены на всей числовой оси.
Если Вам надо подсчитать cosx в какой-то точке с определенной точностью (о которой у Вас кстати ни слова), то причем тут
while x>=pi do
x:=x-pi*2; ?
puporev вне форума Ответить с цитированием
Старый 04.10.2008, 22:26   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

замкчание по оптимизации вычислений

c:=power(x,i*2)/factorial(i*2)

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

r1:=r1*(x*x)/(i)*(i+1);
c:=c+r1;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.10.2008, 06:53   #6
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

То что функция определена на всей числовой прямой, это я знаю, но если убрать это
Цитата:
while x>=pi do
x:=x-pi*2;
то все работает не правильно. А вообще мне нужно расчитать sin и cos любого угла с точностью 4 символа после запятой.
Kostia вне форума Ответить с цитированием
Старый 05.10.2008, 10:13   #7
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Если сравнить слагаемые ряда, то синус можно вычислить так:
u[1]:=x; //первое слагаемое
u[k+1]:=-x*x*u[k]/(2*k)/(2*k+1); //все последующие слагаемые
sin(x):=u[1]+u[2]+u[3]+.......
расчёт заканчиваем, когда abs(u[k+1])<=epsilon;

аналогично для косинуса:
u[1]:=1; //первое слагаемое
u[k+1]:=-x*x*u[k]/(2*k)/(2*k-1); //все последующие слагаемые
cos(x):=u[1]+u[2]+u[3]+.......
расчёт заканчиваем, когда abs(u[k+1])<=epsilon;
Код:
var
  eps: real;

function _Sin(x: real): real;
var
  u,u0,u1: real;
  k: integer;
begin
  u1:=x; k:=0; u:=u1;
  repeat
    k:=k+1; u0:=u1;
    u1:=-x*x*u0/(2*k)/(2*k+1);
    u:=u+u1;
  until abs(u1) <= eps;
  result:=u;
end;

function _Cos(x: real): real;
var
  u,u0,u1: real;
  k: integer;
begin
  u1:=1; k:=0; u:=u1;
  repeat
    k:=k+1; u0:=u1;
    u1:=-x*x*u0/(2*k)/(2*k-1);
    u:=u+u1;
  until abs(u1) <= eps;
  result:=u;
end;

Последний раз редактировалось _Dmitry; 05.10.2008 в 10:15.
_Dmitry вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
log(abs(cos(x))) DeFace Общие вопросы C/C++ 3 28.09.2008 17:32
Есть ли функция для cos параметр которого не радианы, а градусы? Gromsky Помощь студентам 6 14.03.2008 16:26
Ряд Тейлора . Паскаль Zond235 Паскаль, Turbo Pascal, PascalABC.NET 5 30.01.2008 01:42
Процедура, вычисляющая Y=a*cos(G) и X=a*sin(G) Vishez Помощь студентам 4 25.04.2007 17:41