|
Вопрос # 2 171/ вопрос открыт / |
|
Здраствуйте, уважаемые эксперты!
В тупик зашел...
Помогите решить данную задачу.
необходимо вывести на экран таблицу значений функции 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
Я чтото запутался код ниже, возможно не совсем правильный
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
-
- type
- TForm1 = class(TForm)
- Edit1: TEdit;
- Edit2: TEdit;
- Label1: TLabel;
- Label2: TLabel;
- Edit3: TEdit;
- Edit4: TEdit;
- Label3: TLabel;
- Label4: TLabel;
- Memo1: TMemo;
- Button1: TButton;
- procedure FormCreate(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- Edit1.text:='0,1';
-
- Edit2.text:='1';
-
- Edit3.text:='14';
-
- Edit4.text:='0,25';
-
- Memo1.Clear;
-
-
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
-
- var x1,x2,x,h,a,s:extended;
-
- N,k,c:integer;
-
- begin
-
-
- x1:=StrToFloat(Edit4.Text);
-
- Memo1.Lines.Add(' x1='+Edit1.Text);
-
- x2:=StrToFloat(Edit2.Text);
-
- Memo1.Lines.Add(' x2='+Edit2.Text);
-
- N:=StrToInt(Edit3.Text);
-
- Memo1.Lines.Add(' N='+Edit1.Text);
-
- h:=StrToFloat(Edit4.Text);
-
- Memo1.Lines.Add(' h='+Edit4.Text);
-
- c:=-1; x:=x1;
-
- repeat
-
- a:=1; S:=1;
-
- for k:=1 to N do
-
- begin
-
- a:=(n-k)/10;
-
- s:=s+a;
-
- end;
-
-
-
- +FloatToStrF(s,ffFixed,6,2));
-
- x:=x+h;
-
- until x>x2;
-
- end;
 |
Вопрос задал: Lexa.ak (статус: Посетитель)
Вопрос отправлен: 7 декабря 2008, 15:36
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 14; последнее сообщение — 25 декабря 2008, 14:06; участников в обсуждении: 4.
|
Ученый (статус: 8-ой класс), 7 декабря 2008, 18:46 [#1]:
А что именно не получается? Взял ваш код, проверил все вроде бы идет, только может результат не тот который вам нужен получается?
|
|
Lexa.ak (статус: Посетитель), 7 декабря 2008, 22:08 [#2]:
Результат не тот получаеться, я думаю что не правильно записал функцию и ее разложение в ряд.
|
|
Мережников Андрей (статус: Абитуриент), 8 декабря 2008, 14:52 [#3]:
а какого результата хочется получить, если в приведенном коде отсутствует собственно вычисление заданной функции S(x)??? Вместо приведенной функции вычисляется непонятное значение s:=s+a.
|
|
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 (статус: Посетитель), 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 (статус: Посетитель), 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 (статус: Посетитель), 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 (статус: Посетитель), 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]:
Не знаю, цикл сделать пробовали?
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|