Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 171

Раздел: Delphi » Прочее
/ вопрос открыт /

Здраствуйте, уважаемые эксперты!

В тупик зашел...
Помогите решить данную задачу.

необходимо вывести на экран таблицу значений функции Y(x) и ее разложения в ряд S(x) для x изменяющихся от xn до xk с шагом h=(xn-xk)/10.

S(x)=1+3*x^2+..+(2*n+1)/n!*x^2*n

Y(x)=1+2*x^2)*e^x^2

Я чтото запутался код ниже, возможно не совсем правильный

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Edit1: TEdit;
  12. Edit2: TEdit;
  13. Label1: TLabel;
  14. Label2: TLabel;
  15. Edit3: TEdit;
  16. Edit4: TEdit;
  17. Label3: TLabel;
  18. Label4: TLabel;
  19. Memo1: TMemo;
  20. Button1: TButton;
  21. procedure FormCreate(Sender: TObject);
  22. procedure Button1Click(Sender: TObject);
  23. private
  24. { Private declarations }
  25. public
  26. { Public declarations }
  27. end;
  28.  
  29. var
  30. Form1: TForm1;
  31.  
  32. implementation
  33.  
  34. {$R *.dfm}
  35.  
  36. procedure TForm1.FormCreate(Sender: TObject);
  37. begin
  38. Edit1.text:='0,1';
  39.  
  40. Edit2.text:='1';
  41.  
  42. Edit3.text:='14';
  43.  
  44. Edit4.text:='0,25';
  45.  
  46. Memo1.Clear;
  47.  
  48.  
  49. end;
  50.  
  51. procedure TForm1.Button1Click(Sender: TObject);
  52.  
  53. var x1,x2,x,h,a,s:extended;
  54.  
  55. N,k,c:integer;
  56.  
  57. begin
  58.  
  59.  
  60. x1:=StrToFloat(Edit4.Text);
  61.  
  62. Memo1.Lines.Add(' x1='+Edit1.Text);
  63.  
  64. x2:=StrToFloat(Edit2.Text);
  65.  
  66. Memo1.Lines.Add(' x2='+Edit2.Text);
  67.  
  68. N:=StrToInt(Edit3.Text);
  69.  
  70. Memo1.Lines.Add(' N='+Edit1.Text);
  71.  
  72. h:=StrToFloat(Edit4.Text);
  73.  
  74. Memo1.Lines.Add(' h='+Edit4.Text);
  75.  
  76. c:=-1; x:=x1;
  77.  
  78. repeat
  79.  
  80. a:=1; S:=1;
  81.  
  82. for k:=1 to N do
  83.  
  84. begin
  85.  
  86. a:=(n-k)/10;
  87.  
  88. s:=s+a;
  89.  
  90. end;
  91.  
  92.  
  93.  
  94. +FloatToStrF(s,ffFixed,6,2));
  95.  
  96. x:=x+h;
  97.  
  98. until x>x2;
  99.  
  100. end;


Lexa.ak Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Lexa.ak (статус: Посетитель)
Вопрос отправлен: 7 декабря 2008, 15:36
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 14; последнее сообщение — 25 декабря 2008, 14:06; участников в обсуждении: 4.
Ученый

Ученый (статус: 8-ой класс), 7 декабря 2008, 18:46 [#1]:

А что именно не получается? Взял ваш код, проверил все вроде бы идет, только может результат не тот который вам нужен получается?
Lexa.ak

Lexa.ak (статус: Посетитель), 7 декабря 2008, 22:08 [#2]:

Результат не тот получаеться, я думаю что не правильно записал функцию и ее разложение в ряд.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 8 декабря 2008, 14:52 [#3]:

а какого результата хочется получить, если в приведенном коде отсутствует собственно вычисление заданной функции S(x)??? Вместо приведенной функции вычисляется непонятное значение s:=s+a.
Lexa.ak

Lexa.ak (статус: Посетитель), 8 декабря 2008, 16:30 [#4]:

А подскажите как задать S(x) и как факториал записываеться?
Вадим К

Вадим К (статус: Академик), 8 декабря 2008, 16:38 [#5]:

факториал - это произведение всех натуральных от 1 до n
n! = 1*2*3*.....(n-1)*n
Галочка "подтверждения прочтения" - вселенское зло.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 декабря 2008, 05:25 [#6]:

Вы уверены, что разложение правильно записано? Я попробовал подставить в (2*n+1)/n! значение n=2, получается 5/2, а не 3
Lexa.ak

Lexa.ak (статус: Посетитель), 9 декабря 2008, 16:07 [#7]:

Уверен. единственное что я не указал это: xn=0.1; xk=1; n=14
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 декабря 2008, 18:06 [#8]:

Объявите массив kfc действительных чисел размером [1..13] (если n - фиксированное значение). Вычислите сначала коэффициенты и запишите в элементы этого массива. А затем, в цикле, пробегайте значения от xn до xk, подставляйте их в формулу и получите требуемый результат.
S(x)=1+kfc[1]*x^2+...+kfc[n-1]*X^2*n. Для вычисления коэффициентов также можно воспользоваться циклом.
Lexa.ak

Lexa.ak (статус: Посетитель), 16 декабря 2008, 18:24 [#9]:

Да нет, массив здесь не причем.. Вычислил коффиценты вручную.

Только выдает ошибку Incompatible types: 'Integer' and 'Exteded'.
В чем проблема, какой тип я не правильно указал?

unit Unit3;

interface

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

type
TForm3 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
Memo1: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);

var

xn,xk,x,x0,h,s: extended;

N,k,b:integer;



begin

xn:=StrToInt(Edit1.Text);

Memo1.Lines.Add(' x1='+Edit1.Text);

xk:=StrToInt(Edit2.Text);

Memo1.Lines.Add(' x2='+Edit2.Text);

N:=StrToInt(Edit3.Text);

Memo1.Lines.Add(' N='+Edit1.Text);


x:=xn;



repeat

S:=0; b:=1;

for k:=1 to N-1 do

begin

b:=b+sqr(x)+(2*n+3)/(n+1)*(2*n+1);

s:=s+b;

end;

Memo1.Lines.Add('при x='+FloatToStrF(x,ffFixed,6,2)+' сумма ='

+FloatToStrF(s,ffFixed,6,2));

x:=x+h;

until x>xk;

end;


procedure TForm3.FormCreate(Sender: TObject);
begin
Edit1.Text:='0.1';

Edit2.text:='1';

Edit3.text:='14';

Memo1.Clear;

Memo1.Lines.Add('Результаты');


end;

end.
Вадим К

Вадим К (статус: Академик), 16 декабря 2008, 18:41 [#10]:

Следим внимательно за руками
Edit1.Text:='0.1'; - далеко не факт, что точка, может и запятая. Всё зависит от региональных настроек.
xn:=StrToInt(Edit1.Text); - оба. Вот и оно. StrToInt не может преобразовать в вещественное число. Если бы в поле ввода было целое, то оно конечно то всё сработало.
Используем StrToFloat
Галочка "подтверждения прочтения" - вселенское зло.
Lexa.ak

Lexa.ak (статус: Посетитель), 16 декабря 2008, 20:53 [#11]:

Теперь такая ошибка (Incompatible types: 'Integer' and 'Exteded') только у формулы : b:=b+sqr(x)+(2*n+3)/(n+1)*(2*n+1)

здесь то что не так?
Вадим К

Вадим К (статус: Академик), 17 декабря 2008, 03:00 [#12]:

Продолжаем внимательно следить за руками.
b:=b+sqr(x)+(2*n+3)/(n+1)*(2*n+1);
b у нас целое. а вот x - вещественное, квадрат от вещественного - тоже вещественное(Exteded). Третье слагаемое - это результат деления двух целых результатов - тоже вещественное число (только теперь это Real)
Результат сложения Integer + Exteded + real будет Exteded - всегда выбирается "более вместительный" тип. И теперь все это пытаемся присвоить Integer. А такое присваивание неоднозначно. поэтому либо b должно быть типа Exteded, либо надо округлять (например используя Round).
Галочка "подтверждения прочтения" - вселенское зло.
Lexa.ak

Lexa.ak (статус: Посетитель), 25 декабря 2008, 12:57 [#13]:

Находит только значение при x:=0.1, а мне надо что бы перебирал от 0,1 до 1. как это сделать?

unit Unit3;

interface

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

type
TForm3 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
Memo1: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);

var

b,xn,xk,x,x0,f,s:extended;

N,k:integer;



begin

xn:=StrToFloat(Edit1.Text);

Memo1.Lines.Add(' x1='+Edit1.Text);

xk:=StrToFloat(Edit2.Text);

Memo1.Lines.Add(' x2='+Edit2.Text);

N:=StrToInt(Edit3.Text);

Memo1.Lines.Add(' N='+Edit1.Text);


x:=xn;



repeat

S:=0; b:=1;

for k:=1 to N-1 do

begin

b:=b+sqr(x)+(2*n+3)/(n+1)*(2*n+1);

s:=s+b;

end;

Memo1.Lines.Add('при x='+FloatToStrF(x,ffFixed,6,2)+' сумма =' +FloatToStrF(s,ffFixed,6,2));

x:=x+s;

until x>xk;

end;


procedure TForm3.FormCreate(Sender: TObject);
begin
Edit1.Text:='0,1';

Edit2.text:='1';

Edit3.text:='14';

Memo1.Clear;

Memo1.Lines.Add('Результаты');


end;

end.
Вадим К

Вадим К (статус: Академик), 25 декабря 2008, 14:06 [#14]:

Не знаю, цикл сделать пробовали?
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.02 сек.