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

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

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

Автор: Beauty_ 1.05.2007 15:33

Даны числовой ряд и некоторое число E. найти сумму тех членов ряда, модуль которых больше или равен заданному E. общий член ряда имеет вид
Прикрепленное изображение

М
Beauty, пожалуйста выбирай более экономные форматы. Я отредактировал (сравни: твой .bmp был 92К, этот .gif - всего лишь 1.4К).


Автор: kess 2.05.2007 7:17

как решить такую задачу, со степенью и факториалом в одной формуле?

Автор: Lapp 2.05.2007 7:37

Цитата(kess @ 2.05.2007 4:17) *

как решить такую задачу, со степенью и факториалом в одной формуле?

Сделай функции для вычисления всего этого.
Например:
function Factorial(n:integer):LongInt;
begin
if n>1 then Factorial:=n*Factorial(n-1) else Factorial:=1
end;

function IntPower(a:real; n:integer):real;
begin
if n>0 then Power:=a*Power(a,n-1) else Power:=1
end;

Дальше понятно?

Автор: kess 2.05.2007 7:42

Цитата(Lapp @ 2.05.2007 4:37) *

Дальше понятно?

не оч (((

Автор: Lapp 2.05.2007 7:52

Хорошо, продвигаемся вместе..
Вот примерно так это можно сделать (с учетом функций, приведенных выше)

S:=0;
n:=1;
repeat
a:=Power(2/n,n)*Factorial(n);
if a>=e then S:=S+a else break;
Inc(n)
until false;

Теперь стало понятнее? smile.gif


Добавил увеличение n - забыл в первый раз, извините

Автор: kess 2.05.2007 8:04

Цитата(Lapp @ 2.05.2007 4:52) *

Хорошо, продвигаемся вместе..
Вот примерно так это можно сделать (с учетом функций, приведенных выше)
S:=0;
n:=1;
repeat
a:=Power(2/n,n)*Factorial(n);
if a>=e then S:=S+a else break
until false;

Теперь стало понятнее? smile.gif

ну так

Автор: Lapp 2.05.2007 8:08

Цитата(kess @ 2.05.2007 5:04) *

ну так

? blink.gif
что это значит?

Автор: kess 2.05.2007 8:10

Цитата(Lapp @ 2.05.2007 5:08) *

? blink.gif
что это значит?

я уже мало что соображаю wacko.gif

Автор: Lapp 2.05.2007 8:12

Цитата(kess @ 2.05.2007 5:10) *

я уже мало что соображаю wacko.gif

Скорее еще, а не уже.. smile.gif
Написать всю прогу?

Автор: kess 2.05.2007 8:14

Цитата(Lapp @ 2.05.2007 5:12) *

Скорее еще, а не уже.. smile.gif
Написать всю прогу?

если не влом, то да))) буду очень благодарна)

Автор: Lapp 2.05.2007 8:21

Вот так - вроде должно работать (не проверял)

function Factorial(n:integer):LongInt;
begin
if n>1 then Factorial:=n*Factorial(n-1) else Factorial:=1
end;

function IntPower(a:real; n:integer):real;
begin
if n>0 then IntPower:=a*IntPower(a,n-1) else IntPower:=1
end;

var
a,S,e:real;
n:integer;

begin
Write('Введите точность E: ');
ReadLn(e);
S:=0;
n:=1;
repeat
a:=IntPower(2/n,n)*Factorial(n);
if a>=e then S:=S+a else break;
Inc(n)
until false;
WriteLn('Сумма ',n,' членов ряда (меньших ',e,') равна ',S)
end.

Я в предыдущем фрагменте забыл увеличивать n sad.gif. Сейчас испрвлю там тоже..

Еще и с именем функции возведения в степень напутал.. Исправлено.

Автор: kess 2.05.2007 8:39

Цитата(Lapp @ 2.05.2007 5:21) *

Вот так - вроде должно работать (не проверял)
function Factorial(n:integer):LongInt;
begin
if n>1 then Factorial:=n*Factorial(n-1) else Factorial:=1
end;

function IntPower(a:real; n:integer):real;
begin
if n>0 then Power:=a*Power(a,n-1) else Power:=1
end;

var
a,S,e:real;
n:integer;

begin
Write('Введите точность E: ');
ReadLn(e);
S:=0;
n:=1;
repeat
a:=Power(2/n,n)*Factorial(n);
if a>=e then S:=S+a else break;
Inc(n)
until false;
WriteLn('Сумма ',n,' членов ряда (меньших ',e,') равна ',S)
end.

Я в предыдущем фрагменте забыл увеличивать n sad.gif. Сейчас испрвлю там тоже..
спасибо

Автор: Lapp 2.05.2007 8:45

Но вообще-то это не лучший способ считать, поскольку числитель и знаменатель очень большие и переполняются, хотя их частное вполне нормальное.. Поэтому количество членов ряда сильно ограничено.
Вот так будет лучше:

var
a,S,e:real;
i,n:integer;

begin
Write('Введите точность E: ');
ReadLn(e);
S:=0;
n:=1;
repeat
a:=1;
for i:=1 to n do a:=a*2*i/n;
if a>=e then S:=S+a else break;
Inc(n)
until false;
WriteLn('Сумма ',n,' членов ряда (меньших ',e,') равна ',S)
end.

Автор: -Volvo- 2.05.2007 12:04

Цитата
Вот так будет лучше:
Возможно, только это совсем не то же самое, что требуется по условию... Условие требует найти:

(21 * 1!) / 11 + (22 * 2!) / 22 + (23 * 3!) / 33 + ...

А что ищется в последнем примере?

(21 * 1!) / 1 + (22 * 2!) / (1*2) + (23 * 3!) / (1*2*3) + ...

Автор: Lapp 2.05.2007 12:13

Цитата(-Volvo- @ 2.05.2007 9:04) *

А что ищется в последнем примере?

(21 * 1!) / 1 + (22 * 2!) / (1*2) + (23 * 3!) / (1*2*3) + ...

volvo, не догоняю.. Почему?..
Внутренний цикл по i, а делю я на n всякий раз.. У тебя получается внизу тоже факториал. Значит, факториал сокращается, остается только 2n. Эта величина всегда больше единицы! Я гонял свою прогу, она выдает тот же самый ответ, что и первый вариант (конечно, при малых n).

Я что-то упускаю?..

Автор: volvo 2.05.2007 15:29

ypriamii.gif Lapp, извини, немного не так прочитал цикл, потом уже в машине понял что ошибся, но времени ответить не было... Все верно в твоей программе.

Автор: kess 3.05.2007 0:42

а если так?? там возведение в степень +факториал.......


Program posledovatelnost;
Uses CRT;
var
a,S,E:real;
k,n:integer;

begin
ClrScr;
WriteLn('VVedite to4nost E: ');
ReadLn(E);
WriteLn('Vvedite n ');
ReadLn(n);

for k:=1 to n-1 do
a:=(exp(n*ln(2)))*(k*(k+1))/exp(n*Ln(n));
If abs(a)>=E Then S:=S+a else S:=0;
WriteLn('Symma ',n,'-x 4lenov rjada pavna= ', s:4:2);
Repeat until Keypressed;
end.

Автор: volvo 3.05.2007 0:48

А откуда ты знаешь, сколько элементов тебе надо будет просуммировать? Тебе по условию N не дано...

Автор: kess 3.05.2007 1:00

Цитата(volvo @ 2.05.2007 21:48) *

А откуда ты знаешь, сколько элементов тебе надо будет просуммировать? Тебе по условию N не дано...

обычно любой можно задать

Автор: Lapp 3.05.2007 2:18

Цитата(kess @ 2.05.2007 22:00) *

обычно любой можно задать
Это как это?? blink.gif
Обычно много чего можно... Но речь идет не о том, что обычно можно, а о том, что сейчас нужно!

Но это не единственная твоя ошибка..
Цитата(kess @ 2.05.2007 21:42) *

а если так?? там возведение в степень +факториал.......

Попытаюсь сделать первый проход по ошибкам (типа нулевое приближение smile.gif).

{ 1. Перед циклом весьма желательно обнулять переменную для суммы }
for k:=1 to n-1 do { 2. Тут нужен begin, видимо, иначе оператор If не в цикле. И почему цикл до n-1? }
a:=(exp(n*ln(2)))*(k*(k+1))/exp(n*Ln(n)); { 3. Расчет факториала неверный }
If abs(a)>=E Then S:=S+a else S:=0; { 4. Зачем обнуление суммы здесь?.. }
{ 5. А тут нужен end к begin'у (см. п.2 }


И вообще, нужен, конечно, не for, а repeat (или while).
Извини, просто любопытство: а чем тебе не понравился мой последний вариант? Что-то непонятно?

Автор: kess 3.05.2007 2:33

Цитата(Lapp @ 2.05.2007 23:18) *

Это как это?? blink.gif
Обычно много чего можно... Но речь идет не о том, что обычно можно, а о том, что сейчас нужно!

Но это не единственная твоя ошибка..

Попытаюсь сделать первый проход по ошибкам (типа нулевое приближение smile.gif).

{ 1. Перед циклом весьма желательно обнулять переменную для суммы }
for k:=1 to n-1 do { 2. Тут нужен begin, видимо, иначе оператор If не в цикле. И почему цикл до n-1? }
a:=(exp(n*ln(2)))*(k*(k+1))/exp(n*Ln(n)); { 3. Расчет факториала неверный }
If abs(a)>=E Then S:=S+a else S:=0; { 4. Зачем обнуление суммы здесь?.. }
{ 5. А тут нужен end к begin'у (см. п.2 }


И вообще, нужен, конечно, не for, а repeat (или while).
Извини, просто любопытство: а чем тебе не понравился мой последний вариант? Что-то непонятно?

обнуление суммы... он и так выдаёт)

переменные обычно задаются по желанию...

Автор: volvo 3.05.2007 2:37

kess, никогда не полагайся на то, что компилятор делает по своему желанию... Вот сейчас у тебя это "и так выдает", а я добавлю к твоей программе 3 строки, и у тебя будет выдаваться бред, причем каждый раз - разный... Вывод - всегда инициализируй переменную начальным значением.

Автор: Lapp 3.05.2007 2:42

Цитата(kess @ 2.05.2007 23:33) *

переменные обычно задаются по желанию...

Замечательно.
А почему бы тогда сразу ответ (переменная S) не задать по желанию?.. blink.gif
Кстати, скажи, что именно подсказывает твое желание для задания переменной n? Допустим, преп тебе задал точность e=0.0001. Итак - каково твое желание относительно n?
С нетерпением жду ответа.. smile.gif

Автор: kess 3.05.2007 2:52

с факториалом.....

F:=1;
for k:=1 to n do
F:=F*k;
a:=(exp(n*ln(2)))*F/exp(n*Ln(n));
???

Автор: Lapp 3.05.2007 3:55

Цитата(kess @ 2.05.2007 23:52) *

???


...

Автор: kess 3.05.2007 3:57

Цитата(Lapp @ 3.05.2007 0:55) *

...

в смысле так можно записать нахождение факториала?

F:=1;
for k:=1 to n do
F:=F*k;

Автор: Lapp 3.05.2007 3:57

Да, годится.
Только я бы умножение на F поставил в конец формулы. А две степени объединил бы в одну..

Добавлено через 1 мин.
А как ты собираешься описать F? как целое или вещественное?

Автор: kess 3.05.2007 4:02

Цитата(Lapp @ 3.05.2007 0:57) *

Да, годится.
Только я бы умножение на F поставил в конец формулы. А две степени объединил бы в одну..

Добавлено через 1 мин.
А как ты собираешься описать F? как целое или вещественное?

целое

Автор: Lapp 3.05.2007 5:02

Цитата(kess @ 3.05.2007 1:02) *

целое

Вот это плохо. Тогда у тебя снова будет проблема - не можешь считать для n>15, даже при LongInt.
Делай real.

Автор: kess 3.05.2007 5:05

Цитата(Lapp @ 3.05.2007 2:02) *

Вот это плохо. Тогда у тебя снова будет проблема - не можешь считать для n>15, даже при LongInt.
Делай real.

оки, спс

Автор: мисс_граффити 3.05.2007 14:18

Цитата(Lapp @ 3.05.2007 2:02) *

Вот это плохо. Тогда у тебя снова будет проблема - не можешь считать для n>15, даже при LongInt.
Делай real.

тогда уж extended...