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

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

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

 
 Ответить  Открыть новую тему 
> Проверка разложения функции в ряд
Tribunal
сообщение 5.06.2006 13:22
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


задача в том,что нужно вычислить с заданной погрешностью вычислить
правую и левую части равенства a^x=1+x*lna/1!+(x*lna)^2/2!+...+(x*lna)^n/n!+...,
то есть численно убедиться в его справедливости.+вывести кол-во интеграций,
то бишь скорость сходимости.
вот то,что получилось...не могу понять,где ошибка...(деление на 0)

var
f:integer;
x,i,k,kol:byte;
eps,a,ri,le,s,e:real;
begin
writeln('Davayte proverim razlojenie funkcii a^x...');
write('Vvedite znachenie osnovaniya stepeni a=');read(a);
write('Vvedite znachenie argumenta x=');read(x);
write('Vvedite dopustimuyu pogreshnost eps=');read(eps);

le:=1;
for i:=1 to x do
le:=le*a;
writeln('Levaya chast=',le);

ri:=1;k:=1;kol:=0;
repeat
s:=1;f:=1;
for i:=1 to k do
begin
s:=s*x*ln(a);
f:=f*i;
end;
s:=s/f;
ri:=ri+s;
inc(kol);
e:=abs(le-ri);
inc(k);
until e<=eps;


writeln('Pravaya chast=',ri);
writeln('Kol-vo integracii = ',kol);

end.


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.06.2006 13:47
Сообщение #2


Гость






Цитата
не могу понять,где ошибка...(деление на 0)
Деление на 0 происходит потому, что F переполняется (даже LongInt "держит" только факториал 14, не говоря уже про Integer), и естественно, в F появляется 0... А ты на F делишь...

Именно поэтому, когда производится разложение в ряд желательно не вычислять факториал на каждом шаге, а домножать очередной элемент, как я сделал. Посмотри...
var
x,i,k,kol:byte;
next, eps,a,ri,le,s,e:real;
begin
writeln('Davayte proverim razlojenie funkcii a^x...');
write('Vvedite znachenie osnovaniya stepeni a=');read(a);
write('Vvedite znachenie argumenta x=');read(x);
write('Vvedite dopustimuyu pogreshnost eps=');read(eps);

le:=1;
for i:=1 to x do le:=le*a;
writeln('Levaya chast=',le:10:6);

ri:=1; k:=1; kol:=0;
next := 1;
repeat
next := next * (x * ln(a)) / k;
ri := ri + next;
inc(kol);
e:=abs(le-ri);
inc(k);
until e < eps;

writeln('Pravaya chast=',ri:10:6);
writeln('Kol-vo integracii = ',kol);
end.
 К началу страницы 
+ Ответить 
Tribunal
сообщение 5.06.2006 13:58
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


всё ясно)
большое спасибо


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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