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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2014, 23:38   #1
Yaroma
Пользователь
 
Регистрация: 25.10.2010
Сообщений: 12
По умолчанию Delphi. Вывести таблицу значений функции Y (x) и ее разложения в ряд S (x) и точность е

Помогите, пожалуйста, не первый день уже воюю.
Мое задание:
Вывести на экран таблицу значений функции y(x) и ее разложения в ряд s(x) для x изменяю-щихся от xn до xk с заданным количеством шагов M ( h = (Xn -Xk)/M) и точностью e (близость значе-ний S(x) и Y(x) во всем диапазоне значений x указывает на правильность вычисления S(x) и Y(x)). При выполнении задания S(x) и Y(x) поместить в функции. В местах возможного возникновения ошибок использовать конструкции для обработки исключительных ситуаций.
Снимок.JPG
Непонимаю зачем тут точность(е) и куда ее пихать. Мне бы только код где считается эта таблица. Вот что я напилил:

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Math;

type
  TmainForm = class(TForm)
    edit_m: TEdit;
    label_Xn: TLabel;
    label_Xk: TLabel;
    label_m: TLabel;
    label_e: TLabel;
    Memo_Result: TMemo;
    runButton: TButton;
    buttonExit: TButton;
    procedure FormCreate(Sender: TObject);
    procedure runButtonClick(Sender: TObject);
    procedure buttonExitClick(Sender: TObject);

  private
    { Private declarations }
  end;
var
  mainForm: TmainForm;
const
  Xmin : extended = 0.1;          //Поменять для др. вар.
  Xmax : extended = 0.7;         //Поменять для др. вар.
  e : extended =  0.001;        //Поменять для др. вар.
implementation
{$R *.dfm}

procedure TmainForm.FormCreate(Sender: TObject);
begin
  label_Xn.Caption := 'Xn = ' + FloatToStr(Xmin);
  label_Xk.Caption := 'Xk = ' + FloatToStr(Xmax);
  edit_m.Text := '';
 // label_e.Caption := 'e = ' + FloatToStr(e);
end;


procedure drawTableHeader();
begin
  mainForm.Memo_Result.Clear;
  mainForm.Memo_Result.Lines.Add('------------------------------------');
  mainForm.Memo_Result.Lines.Add('|   x   |   Y(x)    |   S(x)    |');
  mainForm.Memo_Result.Lines.Add('------------------------------------');
end;

function getStep(Xn, Xk: extended; m: integer): Extended;
var step: Extended;
begin
  step := (Xk - Xn) / m;
  result := step;
end;

function factorial(n: integer):Integer;
begin
  result := n;
  while  n > 0 do
  begin
    result := result * n;
    Dec(n);      //декремент
  end;
end;

function calculateY(x: Extended): Extended;
begin
  result := (1 + (2*sqr(x))) * exp(sqr(x));                 //Поменять для др. вар.
// result := exp(x/2);
end;

function calculateS(x: extended; n: integer): Extended;
var p: extended;
begin
    result := (((2*n + 1)) * (Power(x, 2*n)))/factorial(n);               //Поменять для др. вар.
  //result := Power(2*x, n) / factorial(n);
end;

function getString(Xn, Y, S: extended):String;
begin
  result := '|  ' + FloatToStr(Xn) + '|' + FloatToStr(Y) + '|' + FloatToStr(S) + '|';
end;

//Метод инициализирует M и запускает скрипт
procedure run();
var m, counter: integer;
var resultY, resultS, p, y, Sum: extended;
var Xn:extended;
var Xk:extended;
begin
  Xn:= Xmin;
  Xk:= Xmax;
  m := StrToInt(mainForm.edit_m.Text);
  drawTableHeader();
  while Xn <= Xk+getStep(Xmin, Xmax, m)/2 do
  begin
    Sum := 1;
    counter:=1;
    while counter <= m do
      begin;
         Sum := Sum + calculateS(Xn, counter);
         Inc(counter);
      end;
    mainForm.Memo_Result.Lines.Add(getString(Xn, calculateY(Xn), Sum));
    Xn := Xn + getStep(Xmin, Xmax, m);
  end;
end;



procedure TmainForm.runButtonClick(Sender: TObject);
begin
  run();
end;

procedure TmainForm.buttonExitClick(Sender: TObject);
begin
  close;
end;

end.

Последний раз редактировалось Yaroma; 28.01.2014 в 23:48.
Yaroma вне форума Ответить с цитированием
Старый 28.01.2014, 23:52   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а вы покажите участок кода, который считает вот это (обратите внимание, что в данном коде n изменяется от нуля до БЕСКОНЕЧНОСТИ):
Изображения
Тип файла: jpg Снимок.JPG (8.9 Кб, 156 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.01.2014, 00:35   #3
Yaroma
Пользователь
 
Регистрация: 25.10.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а вы покажите участок кода, который считает вот это (обратите внимание, что в данном коде n изменяется от нуля до БЕСКОНЕЧНОСТИ):
Вот этот кусок:
Код:
function calculateS(x: extended; n: integer): Extended;
var p: extended;
begin
    result := (((2*n + 1)) * (Power(x, 2*n)))/factorial(n);               //Поменять для др. вар.
  //result := Power(2*x, n) / factorial(n);
end;

...

while Xn <= Xk+getStep(Xmin, Xmax, m)/2 do
  begin
    Sum := 1;
    counter:=1;
    while counter <= m do
      begin;
         Sum := Sum + calculateS(Xn, counter);
         Inc(counter);
      end;
    mainForm.Memo_Result.Lines.Add(getString(Xn, calculateY(Xn), Sum));
    Xn := Xn + getStep(Xmin, Xmax, m);
  end;
Хмм, действительно, не обратил внимания, а как же это правильно зациклить
Yaroma вне форума Ответить с цитированием
Старый 29.01.2014, 00:57   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Если я, конечно, не ошибаюсь, речь здесь идёт о ряде Маклорена.
Цитата:
Хмм, действительно, не обратил внимания, а как же это правильно зациклить
Возможно это поможет: Интервал сходимости.
Изображения
Тип файла: jpg attachment.jpg (8.9 Кб, 156 просмотров)
Streletz вне форума Ответить с цитированием
Старый 29.01.2014, 09:13   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Yaroma Посмотреть сообщение
Хмм, действительно, не обратил внимания, а как же это правильно зациклить
вот! ВОТ! (как в анекдоте про официанта и ложку )
ну вот, вам и пригодится заданная точность.
Код:
S := 0;
n = 0;
Вычислить очередной член ряда при n=0
повторять
   S := S + очередной член ряда;
   n := n + 1
   вычислить очередной член ряда (рекомендую вывести рекуррентную формулу)
прекратить повторять цикл если  abs(очередной член ряда) < точность конец

Последний раз редактировалось Serge_Bliznykov; 29.01.2014 в 09:16.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.01.2014, 10:01   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
вычислить очередной член ряда (рекомендую вывести рекуррентную формулу)
прекратить повторять цикл если abs(очередной член ряда) < точность конец
Это будет точность для знакопеременного сходящегося ряда. Для знакопостоянного все на порядки сложнее и не факт, что ряд вообще сходится. Вообще не пониманию зачем такое задают, решение таким способом будет формально не соответствовать условию. По хорошему, и то не факт что правильно, нужно оценивать сумму нескольких последних членов ряда
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.01.2014, 19:53   #7
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Не так все просто с этим эпсилон - я как то писал уже про эпсилон

Но в именно в этой задаче все просто - есть сама функция, то есть можно сравнивать с точным значением.
type_Oleg на форуме Ответить с цитированием
Старый 30.01.2014, 08:40   #8
Yaroma
Пользователь
 
Регистрация: 25.10.2010
Сообщений: 12
По умолчанию

Всем большое спасибо, все получилось!
Yaroma вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
необходимо вывести на экран таблицу значений функции Y(x) и ее разложения в ряд S(x) для x изменяющихся от xn до xk с шагом h ArturBattalov Помощь студентам 1 09.05.2013 22:06
Вывести на экран таблицу значений функции Y(x) и ее разложения в ряд ( Delphi ) Mark21 Помощь студентам 4 19.03.2013 15:41
В задаче необходимо вывести на экран таблицу значений функции У(х) и ее разложения в ряд С (х) для значений х от до с шагом.(Паск fashionweek Паскаль, Turbo Pascal, PascalABC.NET 1 07.02.2013 23:11
Вывести на экран таблицу значений функции Y(x) и ее разложения в ряд S(x) DimaKAA Паскаль, Turbo Pascal, PascalABC.NET 0 16.06.2012 18:57
Вывести на экран таблицу значений функции Y(x) и ее разложения в ряд S(x) для x изменяющихся.... EVIL Помощь студентам 3 22.11.2009 02:37