Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Проверьте правильность задачи...

Автор: Crash_Devil 19.12.2007 15:02

Условие:
Вычислить сумму ряда с точностью ε=10(в -5 степени)
Ряд представлен в прикрепленном файле.
Текст программы:
program z1;
const e=0.00001;
var
s{Сумма ряда},n{член ряда},x,x1{Переменная}:real;
i,k:integer;{счетчик}
begin
s:=0;
i:=2;
Write('VVedite x(<=1.01): ');Read(x);
n:=((i*sqr(x))+1)/(sqr(i+1));
s:=s+n;
REPEAT
i:=i+1;
x1:=Power(x,i);n:=((x1*i)+1)/(sqr(i));
if odd(i)=false{чет} then begin
s:=s+n;
i:=i+1;end
else
s:=s-n;
i:=i+1;
until n<e;
writeln(s:20:12);
end.


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

Автор: volvo 19.12.2007 17:54

Во-первых, ты не привел свою реализацию функции Power. А во-вторых я переписал программку по-другому, и вот что получилось (в твою программу добавил вычисление Power через exp(i * ln(x))):

Твоя программа:

Цитата
VVedite x(<=1.01): 1
-4.907396669029
VVedite x(<=1.01): 0.7
-0.179428755969
VVedite x(<=1.01): 0.5
-0.114767705942
VVedite x(<=1.01): 0.3
-0.110536721367

Моя программа:
Цитата
X = 1
0.484380786041
X = 0.7
0.346899755541
X = 0.5
0.272062898495
X = 0.3
0.215163742135
Смотри сам, но почему-то у меня вызывает сомнение результат работы твоей программы. Откуда такая отрицательная сумма при X = 1?

(собственно код пока не смотрел)

Автор: Crash_Devil 19.12.2007 18:17

Когда я делал через експаненту, то ошибку выдавало деления на ноль,и вообще это я добавил услови что вводимое число должно быть меньше либо равно 1.1, просто если другое вводишь получается вещественное переполнение.
Помогите плиз, как правильно надо делать?

Автор: volvo 19.12.2007 19:22

Я сделал вот так:

program z1;
const e=0.00001;
var
s, next, chisl: real;
x: real;
i, sign: integer;

begin
write('X = '); readln(x);
s := 0;
sign := 1; i := 1; chisl := x;
repeat
chisl := chisl*x; { <--- Это заменяет возведение в степень через функцию }
next := ((i + 1) * chisl + 1) / sqr(1.0*i + 1);
inc(i);
s := s + sign * next;
sign := -sign; { <--- Меняем знак следующего члена ряда }
until abs(next) < e;
writeln(s:20:12);
end.

Вроде нигде не ошибся...

Автор: Crash_Devil 19.12.2007 19:52

А почему нельзя к Х применять числа большие 1.1, как понял я - там получается очень большое число, которое не влезает в границы типа real, а может и нет, интересно как оно на самом деле?

Автор: volvo 19.12.2007 20:03

Цитата
А почему нельзя к Х применять числа большие 1.1
Потому что при X большем чем 1 ряд расходится. И как ты собрался искать сумму расходящегося ряда? smile.gif

Автор: Crash_Devil 19.12.2007 21:05

Понятно. Спасибо!