Создать текстовый файл с таблицами фун-ции Бесселя порядка от 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
5.06.2010 14:37
Цитата
Работает неправильно.
Чего ж ты хотел? Глобальные переменные - источник ошибок в программе. Вот и у тебя. Функция Sum, цикл - сравнение Abs(s2-s1) с нулем... А кто и где эти переменные инициализировал? Где им были присвоены начальные значения, можно показать?
marwell
5.06.2010 14:45
Цитата(volvo @ 5.06.2010 14:37)
Чего ж ты хотел? Глобальные переменные - источник ошибок в программе. Вот и у тебя. Функция Sum, цикл - сравнение Abs(s2-s1) с нулем... А кто и где эти переменные инициализировал? Где им были присвоены начальные значения, можно показать?
не понимаю, как это сравнение с нулем?
... e:=0.0000000001; while abs(s2-s1)>=e do begin ...
volvo
5.06.2010 15:02
Ну, с Эпсилоном... Тебе же хуже Сравнение ЧЕГО, ты задал себе вопрос? Допустим (хотя полагаться на это тоже нельзя) при первом вызове 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
5.06.2010 15:30
Цитата(volvo @ 5.06.2010 15:02)
Ну, с Эпсилоном... Тебе же хуже Сравнение ЧЕГО, ты задал себе вопрос? Допустим (хотя полагаться на это тоже нельзя) при первом вызове 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.
Жду от тебя объяснения моего кода. Почему именно так, и как это получилось?
только один вопрос: ты файл с ответом смотрел? результат выполнения твоей программы не совпадает с ответом сорри, тут же только сумма ряда вычисляется или нет? что-то я совсем запутался
marwell
5.06.2010 16:11
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
5.06.2010 16:30
Цитата
ты файл с ответом смотрел? результат выполнения твоей программы не совпадает с ответом
Извиняюсь, ошибся в 15-ой строке. Надо
// Не так // next := (X / 2) / fact; // А вот так: next := 1 / fact;
Я почему-то посчитал, что (X/2)2K при К = 0 будет равно (X/2), а оно будет равно 1. В этом - моя ошибка. Еще вопросы?
Цитата
ты не мог бы просто указать в то место, которое неправильно
Не знаю... Надо проверять программу полностью, а мне лень
marwell
5.06.2010 17:46
Цитата(volvo @ 5.06.2010 16:30)
Извиняюсь, ошибся в 15-ой строке. Надо
// Не так // next := (X / 2) / fact; // А вот так: next := 1 / fact;
Я почему-то посчитал, что (X/2)2K при К = 0 будет равно (X/2), а оно будет равно 1. В этом - моя ошибка. Еще вопросы?
Не знаю... Надо проверять программу полностью, а мне лень
спасибо большое
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.