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

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

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

> функция Бесселя, функция Бесселя
сообщение
Сообщение #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 -


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

Прикрепленные файлы
Прикрепленный файл  _______________________.doc ( 44 килобайт ) Кол-во скачиваний: 280
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 7)
сообщение
Сообщение #2


Гость






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


Бывалый
***

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

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


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

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

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


Жду от тебя объяснения моего кода. Почему именно так, и как это получилось?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






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

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

Цитата
ты не мог бы просто указать в то место, которое неправильно
Не знаю... Надо проверять программу полностью, а мне лень smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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

 





- Текстовая версия 17.05.2024 12:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name