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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2012, 15:22   #1
O'neeL
Пользователь
 
Аватар для O'neeL
 
Регистрация: 10.12.2011
Сообщений: 36
По умолчанию (Delphi) Вычисление Sin(x)

Необходимо вычислить значение синуса с помощью первых семи членов ряда Тейлора.
Все работает, но результат выдает какой то бредовый.
Код:
function Fact(n:integer):integer;
begin
    if n < 0
      then result := 0
      else if ((n = 1) or (n = 0))
              then result := 1
              else result := n * fact(n - 1);
end;

function MySinEl(x: real; count: integer):real;
begin
  result := (Power((-1),2*count+1) / Fact(2*count+1)) * Power(x,2*count+1);
end;

function MySin(x: real; k: integer):real;
var i: integer;
begin
  for i:= 0 to k-1 do
      result := result + MySinEl(x,i);
end;
Вот как функция MySin вызывается
Код:
    x:=StrToFloat(InputX.Text);
    OutputSin.Text:=FloatToStr(MySin(x,7));
Что поправить?
O'neeL вне форума Ответить с цитированием
Старый 13.06.2012, 15:54   #2
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, math, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function Fact(n:integer):integer;
begin
    if n < 0
      then result := 0
      else if ((n = 1) or (n = 0))
              then result := 1
              else result := n * fact(n - 1);
end;

function MySinEl(x: real; count: integer):real;
begin
  result := (Power((-1),2*count+1) / Fact(2*count+1)) * Power(x,2*count+1);
end;

function MySin(x: real; k: integer):real;
var i: integer;
begin
  result:=0;
  for i:= 0 to k-1 do
      result := result - MySinEl(x,i);//вот тут поставил минус
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x:real;
begin
  x:=strtofloat(edit1.Text);
  edit2.Text:=floattostr(mysin(x,7));
  edit3.Text:=floattostr(sin(x));
end;
initialization
decimalseparator:='.';

end.
P.S. чисто наугад.
Изображения
Тип файла: jpg 6514651.JPG (15.6 Кб, 69 просмотров)
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 13.06.2012, 17:10   #3
O'neeL
Пользователь
 
Аватар для O'neeL
 
Регистрация: 10.12.2011
Сообщений: 36
По умолчанию

только вот если ввести 1
то выдает -1,17520119400003, а стандартная функция -0,841470984807897
Если брать значения больше, то получается совсем бредятина
O'neeL вне форума Ответить с цитированием
Старый 13.06.2012, 18:38   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А 7 членов ряда Тейлора не гарантируют хоть какой-нибудь аппроксимации вдали от 0.
Хотите увеличить точность - берите больше членов.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пусть задано значение X. Найти первое из чисел sin X, sin sin X, sin sin sin X, ... , меньшее по модулю 10-4. hex_91 Visual C++ 1 28.04.2012 23:49
Паскаль Вычислить у - первое из чисел sin х, sin sin x, sin sin sin x, ..., меньшее по модулю 10-4 Kikikiss Помощь студентам 2 25.03.2012 13:58
Вычисление суммы:sinx+sin(sinx)+sin(sin(sinx)) ..+..sin(..(sinx)) на дельфи Nach Помощь студентам 3 16.11.2011 10:05
Что-то не то с Sin на Delphi Ybn2 Помощь студентам 6 18.12.2010 09:52