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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 2)
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

 

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