IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> функция Бесселя, функция Бесселя
marwell
сообщение 5.06.2010 14:23
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Создать текстовый файл с таблицами фун-ции Бесселя порядка от 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.
Работает неправильно. Не могу понять, в чем ошибка...

Сообщение отредактировано: marwell - 5.06.2010 14:25


Эскизы прикрепленных изображений
Прикрепленное изображение

Прикрепленные файлы
Прикрепленный файл  _______________________.doc ( 44 килобайт ) Кол-во скачиваний: 158
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.06.2010 14:37
Сообщение #2


Гость






Цитата
Работает неправильно.
Чего ж ты хотел? Глобальные переменные - источник ошибок в программе. Вот и у тебя. Функция Sum, цикл - сравнение Abs(s2-s1) с нулем... А кто и где эти переменные инициализировал? Где им были присвоены начальные значения, можно показать?
 К началу страницы 
+ Ответить 
marwell
сообщение 5.06.2010 14:45
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Цитата(volvo @ 5.06.2010 14:37) *

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

не понимаю, как это сравнение с нулем?
... e:=0.0000000001;
while abs(s2-s1)>=e do begin ...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.06.2010 15:02
Сообщение #4


Гость






Ну, с Эпсилоном... Тебе же хуже 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
сообщение 5.06.2010 15:30
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Цитата(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 - 5.06.2010 15:45
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
marwell
сообщение 5.06.2010 16:11
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.06.2010 16:30
Сообщение #7


Гость






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

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

Цитата
ты не мог бы просто указать в то место, которое неправильно
Не знаю... Надо проверять программу полностью, а мне лень smile.gif
 К началу страницы 
+ Ответить 
marwell
сообщение 5.06.2010 17:46
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Цитата(volvo @ 5.06.2010 16:30) *

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

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

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

спасибо большое
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 14.07.2025 2:02
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"