Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.11.2011, 04:35
toper toper вне форума
Прохожий
 
Регистрация: 27.11.2011
Сообщения: 4
Репутация: 10
По умолчанию Вычисление числа Пи тремя способами

Доброго времени суток всем.

Есть такая задача

  • Вычислить с заданной точностью константу π, используя бесконечный
    Ряд Шарпа (1699 г.): 2 * sqrt(3) * (1 - 1/(3^1)*3 + 1/(3^2)*5 + 1/(3^3)*7 + 1/(3^4)*9 + ... )
    Ряд Лейбница (1673 г.): п/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - ...
    Ряд Эйлера (1736 г.): (п^2)/6 = 1 + 1/2^2 + 1/3^2 + 1/4^2 + 1/5^2...

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

************

Начал писать программу, запнулся на ряде Лейбница, да и Эйлера тоже, что-то я неправильно пишу походу - значения неверные выдаёт

Помогите пожалуйста, я первый раз сам пишу программу.

Код:
unit VichisleniePi;

interface

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

type
  TForm1 = class(TForm)
    Sharp: TEdit;
    Leybnitc: TEdit;
    Eyler: TEdit;
    Calc: TBitBtn;
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    lbl4: TLabel;
    Tochnost: TEdit;
    lbl5: TLabel;
    procedure CalcClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CalcClick(Sender: TObject);

var i, n, sign1: integer;
     s, curr:Extended;
BEGIN
  begin
   n := StrToInt(Tochnost.Text);
   s := 0; curr := 1;
    for i := 1 to n do
      begin
       s := s + 1 / (curr * (2 * i - 1));
       curr := - curr * 3;
      end;
    s := s * sqrt(12);
    Sharp.Text:=FloatToStr(s);
  end;
    begin
      s :=0;
      sign1 := 1;
        for i := 0 to n do ;
          begin
            s := s + sign1 * 4 / ( 2*i + 1);
            sign1:= -sign1;
          end;
       Leybnitc.Text:=FloatToStr(s)
     end;
       begin
          s:= 0;
          for i := 1 to n do
           begin
             s:= 1/sqr(n) ;
           end;
          s:= Sqrt (6*s)   ;
          Eyler.Text:=FloatToStr(s)
        end;
END;
end.
Ответить с цитированием
  #2  
Старый 27.11.2011, 06:06
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

у лейбница:
; после do - цикл не выполняется
4 не там где надо
s = 0 sign = 1 и вто же время Leybnitc.Text:=FloatToStr(s) ??
у эйлера как минимум: s:= 1/sqr(n) - касяк
вобще есть отладка по шагам, брейкпоинты, рекомендую узнать что это такое
Ответить с цитированием
  #3  
Старый 27.11.2011, 08:11
toper toper вне форума
Прохожий
 
Регистрация: 27.11.2011
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
у лейбница:
; после do - цикл не выполняется

Цитата:
Сообщение от Pyro
4 не там где надо
s = 0 sign = 1 и вто же время Leybnitc.Text:=FloatToStr(s) ??
после того как убрал ; - стало всё считаться

Цитата:
Сообщение от Pyro
у эйлера как минимум: s:= 1/sqr(n) - касяк
можно поподробней пожалуста


Цитата:
Сообщение от Pyro
вобще есть отладка по шагам, брейкпоинты, рекомендую узнать что это такое
пойду гуглить ))
Ответить с цитированием
  #4  
Старый 27.11.2011, 09:10
toper toper вне форума
Прохожий
 
Регистрация: 27.11.2011
Сообщения: 4
Репутация: 10
По умолчанию

Всё дотумкал в Эйлере что да как =))

Код сейас такой
Код:
unit VichisleniePi;

interface

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

type
  TForm1 = class(TForm)
    Sharp: TEdit;
    Leybnitc: TEdit;
    Eyler: TEdit;
    Calc: TBitBtn;
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    lbl4: TLabel;
    Tochnost: TEdit;
    lbl5: TLabel;
    procedure CalcClick(Sender: TObject);
    procedure TochnostKeyPress(Sender: TObject; var Key: Char);
    procedure SharpKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CalcClick(Sender: TObject);

var i, n, sig: integer;
     s, cur:Extended;
     
BEGIN
  if Tochnost.Text='' then ShowMessage('Введите точность')
  else
   begin
   n := StrToInt(Tochnost.Text);
    if n>10300 then ShowMessage('Слишком большая точность')
    else
      begin
        begin

        s := 0; cur := 1;
         for i := 1 to n do
          begin
            s := s + 1 / (cur * (2 * i - 1));
            cur := - cur * 3;
          end;
         s := s * sqrt(12);
          Sharp.Text:=FloatToStr(s);
        end;
          begin
          s :=0;
           sig := 1;
            for i := 0 to n do
             begin
               s := s + sig * 4 / ( 2*i + 1);
                sig := -sig;
             end;
           Leybnitc.Text:=FloatToStr(s)
          end;
            begin
            s:= 0;
             for i := 1 to n do
              begin
                s:= s + 1/sqr(i) ;
              end;
             s:= Sqrt(6*s)   ;
              Eyler.Text:=FloatToStr(s)
            end;
      end;
    end;
END;

procedure TForm1.TochnostKeyPress(Sender: TObject; var Key: Char);
begin
 if not (key in ['0'..'9',#8]) then key:=#0;
end;

procedure TForm1.SharpKeyPress(Sender: TObject; var Key: Char);
begin
 Key:=#0
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
Tochnost.SetFocus;
end;

end.       

Теперь надо
Цитата:
Сравнить полученные значения, в качестве критерия сравнения использовать количество членов ряда, необходимых для вычисления числа π
я непойму чего от меня тут хотят ((

Помогите, а?

Последний раз редактировалось toper, 27.11.2011 в 10:12.
Ответить с цитированием
  #5  
Старый 27.11.2011, 11:58
U.B.M. U.B.M. вне форума
Новичок
 
Регистрация: 06.10.2011
Сообщения: 94
Версия Delphi: Delphi 7
Репутация: 13
По умолчанию

Есть число пи. Оно иррациональное, т.е. после запятой у него бесконечно много знаков. Есть точность его определения - необходимое кол-во знаков.

пи с точностью до целых = 3
пи с точностью до десятых = 3.1
пи с точностью до тысячных = 3,142.

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

Код:
...
    if n>10300 then ShowMessage('Слишком большая точность')
...
         for i := 1 to n do
...

n - кол-во членов ряда при такой постановке, а не точность.

точность может быть 0.0001 - т.е. твое значение отличается от значения пи не более чем на указанную величину.

По поводу кода:
вместо
Код:
for i := 0 to n
исплользуй
Код:
count := 0;
while (tochnost <= abs(Pi - sum))
begin
//прибавляешь очередной член ряда к сумме
count := count + 1;
end;

В переводе на человеческий : пока точность меньше разницы между пи и суммой твоего ряда. Count - счетчик кол-ва просуммированных членов ряда


P.S. В uses добавь модуль Math, константа называется Pi.
Ответить с цитированием
  #6  
Старый 27.11.2011, 14:52
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

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

Оно конечно к заданию отношения не имеет. Но уж очень занятная игрушка.
Вложения
Тип файла: zip Pi.zip (206.2 Кбайт, 4 просмотров)
Ответить с цитированием
  #7  
Старый 28.11.2011, 04:24
toper toper вне форума
Прохожий
 
Регистрация: 27.11.2011
Сообщения: 4
Репутация: 10
По умолчанию

Охохо это всё переписывать по новой (
Оставлю так как есть, если препод скажет переписывать буду переписывать, там ещё 7 прог надо написать к экзамену ))) Вот ими пока и займусь.
Главное то в этих заданиях - освоить тему "Циклы", тут вроде циклы есть, авось простят мне непонятливость ))

Последний раз редактировалось toper, 28.11.2011 в 04:27.
Ответить с цитированием
  #8  
Старый 28.11.2011, 07:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Для Лейбница и Эллера у меня получился вот такой код:

Код:
function TForm1.PI_leib(e: Extended; var Cnt : Integer): Extended;
var
  I : Integer;
  Sng : Integer;
  dx : Extended;
begin
  Cnt := 0;
  I := 1;
  Sng := 1;
  dx := 1;
  Result := 0;

  While Abs(dx) > Abs(e) Do
    Begin
      Result := Result + dx;
      Inc(Cnt);

      Inc(I,2);
      Sng := Sng * (-1);

      dx := Sng/I;
    End;

  Result := Result * 4;
end;

function TForm1.PI_eiler(e: Extended; var Cnt : Integer): Extended;
var
  I : Integer;
  dx : Extended;
begin
  Cnt := 0;
  Result := 0;
  I := 1;
  dx := 1;
  While Abs(dx) > Abs(e) Do
    Begin
      Result := Result + dx;
      Inc(Cnt);

      Inc(I);
      dx := 1/Sqr(I);
    End;

  Result := Sqrt(Result*6);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Cnt : Integer;
  P : Extended;
begin
  P := PI_leib(0.000001,Cnt);
  //P := PI_eiler(0.000001,Cnt);
  ShowMessage(Format('Pi = %.6f; %d steps.',[P,Cnt]));
end;

Последняя процка - просто пример вызова с выводом результата.
Чем выше задашь точность (чем меньше значение е), тем точнее считает. Только вот кол-во итераций получается большим...
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:38.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025