Помощь - Поиск - Пользователи - Календарь
Полная версия: функция Бесселя
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
marwell
Создать текстовый файл с таблицами фун-ции Бесселя порядка от 0 до 4(всего 5 фун-ции)для х=0,5; 1,0; 1,5...10 с точностью 6 знаков после десятичной точки. функция Бесселя N порядка (см.вложение)+файл с ответом(рез-тат работы программы). Для начала решил сделать просто с выводом на экран:
uses crt;
var mas:array[1..20,1..5] of real;
x,p,e,s2,s1,s,m:real; n,i,k:integer;

function step(x:real; n:integer):real;
begin
p:=1;
if n=0 then p:=1
else begin
for i:=1 to n do begin
p:=x*p;
end; end;
step:=p;
end;

function fact(x:real):real;
begin
if x=0 then fact:=1
else
fact:=fact(x-1)*x;
end;

function sum(x:real; n:real):real;
begin
k:=0;
e:=0.0000000001;
while abs(s2-s1)>=e do begin
s1:=step(-1,k)*(step(x/2,2*k)/(fact(k)*fact(k+n)));
s2:=step(-1,k+1)*(step(x/2,2*(k+1))/(fact(k+1)*fact(k+1+n)));
inc(k);
s:=s+s1;
sum:=s;
end;
end;

begin
clrscr;
for n:=0 to 4 do begin
x:=0;
while x<=10 do begin
x:=x+0.5;
m:=step(x/2,n)*sum(x,n);
write(m:7:6,' | ');
end;
writeln;
end;
readln;
end.
Работает неправильно. Не могу понять, в чем ошибка...
volvo
Цитата
Работает неправильно.
Чего ж ты хотел? Глобальные переменные - источник ошибок в программе. Вот и у тебя. Функция Sum, цикл - сравнение Abs(s2-s1) с нулем... А кто и где эти переменные инициализировал? Где им были присвоены начальные значения, можно показать?
marwell
Цитата(volvo @ 5.06.2010 14:37) *

Чего ж ты хотел? Глобальные переменные - источник ошибок в программе. Вот и у тебя. Функция Sum, цикл - сравнение Abs(s2-s1) с нулем... А кто и где эти переменные инициализировал? Где им были присвоены начальные значения, можно показать?

не понимаю, как это сравнение с нулем?
... e:=0.0000000001;
while abs(s2-s1)>=e do begin ...
volvo
Ну, с Эпсилоном... Тебе же хуже smile.gif Сравнение ЧЕГО, ты задал себе вопрос? Допустим (хотя полагаться на это тоже нельзя) при первом вызове Sum будут и s1 и s2 равны 0. А при втором вызове? Они что после первого вызова изменятся? Где, покажи. Они такими же и останутся, как и были.

А если они равны 0, то
Цитата
while abs(s2-s1)>=e do
когда-нибудь выполнится? Нет. Значит в этот цикл программа даже не зайдет...

Добавлено через 1 мин.
На самом деле (если вычислять сумма ряда как положено, а не таким извратом, как у тебя), тут делов-то на несколько срок, и не нужны ни функции fact, ни step:

function J(n: integer; X: real): real;
const eps = 0.000001;
var
i, k, fact: integer;
p, s, next: real;
begin
p := 1; fact := 1;
for i := 1 to n do
begin
p := p * (X / 2);
fact := fact * i;
end;

s := 0; k := 0;
next := (X / 2) / fact;
repeat
s := s + next; inc(k);
next := - next * sqr(X / 2) / (k * (k + n));
until abs(next) < eps;
J := p * s;
end;

var i, n: integer;
begin
for i := 1 to 20 do
begin
for n := 0 to 4 do
begin
write(J(n, 0.5 * i):10 :6);
end;
writeln;
end;
end.


Жду от тебя объяснения моего кода. Почему именно так, и как это получилось?
marwell
Цитата(volvo @ 5.06.2010 15:02) *

Ну, с Эпсилоном... Тебе же хуже smile.gif Сравнение ЧЕГО, ты задал себе вопрос? Допустим (хотя полагаться на это тоже нельзя) при первом вызове Sum будут и s1 и s2 равны 0. А при втором вызове? Они что после первого вызова изменятся? Где, покажи. Они такими же и останутся, как и были.

А если они равны 0, то
когда-нибудь выполнится? Нет. Значит в этот цикл программа даже не зайдет...

Добавлено через 1 мин.
На самом деле (если вычислять сумма ряда как положено, а не таким извратом, как у тебя), тут делов-то на несколько срок, и не нужны ни функции fact, ни step:

function J(n: integer; X: real): real;
const eps = 0.000001;
var
i, k, fact: integer;
p, s, next: real;
begin
p := 1; fact := 1;
for i := 1 to n do
begin
p := p * (X / 2);
fact := fact * i;
end;

s := 0; k := 0;
next := (X / 2) / fact;
repeat
s := s + next; inc(k);
next := - next * sqr(X / 2) / (k * (k + n));
until abs(next) < eps;
J := p * s;
end;

var i, n: integer;
begin
for i := 1 to 20 do
begin
for n := 0 to 4 do
begin
write(J(n, 0.5 * i):10 :6);
end;
writeln;
end;
end.


Жду от тебя объяснения моего кода. Почему именно так, и как это получилось?

только один вопрос: ты файл с ответом смотрел? результат выполнения твоей программы не совпадает с ответом unsure.gif
сорри, тут же только сумма ряда вычисляется
или нет? что-то я совсем запутался wacko.gif
marwell
volvo, ты не мог бы просто указать в то место, которое неправильно, пожалуйста...
uses crt;
var x,p,e,s2,s1,s,m:real; n,i,k:integer;

function step(x:real; n:integer):real;
begin
p:=1;
if n=0 then p:=1
else begin
for i:=1 to n do begin
p:=x*p;
end; end;
step:=p;
end;

function fact(x:real):real;
begin
if x=0 then fact:=1
else
fact:=fact(x-1)*x;
end;

function sum(x:real; n:real):real;
begin
k:=0;
e:=0.0000000001;
s1:=0;
s2:=1;
while abs(s2-s1)>=e do begin
s1:=step(-1,k)*(step(x/2,2*k)/(fact(k)*fact(k+n)));
s2:=step(-1,k+1)*(step(x/2,2*(k+1))/(fact(k+1)*fact(k+1+n)));
inc(k);
s:=s+s1;
sum:=s;
end;
end;

begin
clrscr;
while x<=10 do begin
x:=x+0.5;
for n:=0 to 4 do begin
m:=step(x/2,n)*sum(x,n);
write(m:7:6,' | ');
end;
writeln;
end;
readln;
end.

volvo
Цитата
ты файл с ответом смотрел? результат выполнения твоей программы не совпадает с ответом
Извиняюсь, ошибся в 15-ой строке. Надо

// Не так
// next := (X / 2) / fact;
// А вот так:
next := 1 / fact;
Я почему-то посчитал, что (X/2)2K при К = 0 будет равно (X/2), а оно будет равно 1. В этом - моя ошибка. Еще вопросы?

Цитата
ты не мог бы просто указать в то место, которое неправильно
Не знаю... Надо проверять программу полностью, а мне лень smile.gif
marwell
Цитата(volvo @ 5.06.2010 16:30) *

Извиняюсь, ошибся в 15-ой строке. Надо

// Не так
// next := (X / 2) / fact;
// А вот так:
next := 1 / fact;
Я почему-то посчитал, что (X/2)2K при К = 0 будет равно (X/2), а оно будет равно 1. В этом - моя ошибка. Еще вопросы?

Не знаю... Надо проверять программу полностью, а мне лень smile.gif

спасибо большое
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.