Форум «Всё о Паскале» _ Задачи _ Вычисление последовательностей
Автор: 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;
Теперь стало понятнее?
Добавил увеличение 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;
Теперь стало понятнее?
ну так
Автор: Lapp 2.05.2007 8:08
Цитата(kess @ 2.05.2007 5:04)
ну так
? что это значит?
Автор: kess 2.05.2007 8:10
Цитата(Lapp @ 2.05.2007 5:08)
? что это значит?
я уже мало что соображаю
Автор: Lapp 2.05.2007 8:12
Цитата(kess @ 2.05.2007 5:10)
я уже мало что соображаю
Скорее еще, а не уже.. Написать всю прогу?
Автор: kess 2.05.2007 8:14
Цитата(Lapp @ 2.05.2007 5:12)
Скорее еще, а не уже.. Написать всю прогу?
если не влом, то да))) буду очень благодарна)
Автор: 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 . Сейчас испрвлю там тоже..
Еще и с именем функции возведения в степень напутал.. Исправлено.
Автор: 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 . Сейчас испрвлю там тоже..
спасибо
Автор: 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
Цитата
Вот так будет лучше:
Возможно, только это совсем не то же самое, что требуется по условию... Условие требует найти:
volvo, не догоняю.. Почему?.. Внутренний цикл по i, а делю я на n всякий раз.. У тебя получается внизу тоже факториал. Значит, факториал сокращается, остается только 2n. Эта величина всегда больше единицы! Я гонял свою прогу, она выдает тот же самый ответ, что и первый вариант (конечно, при малых n).
Я что-то упускаю?..
Автор: volvo 2.05.2007 15:29
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)
обычно любой можно задать
Это как это?? Обычно много чего можно... Но речь идет не о том, что обычно можно, а о том, что сейчас нужно!
Но это не единственная твоя ошибка..
Цитата(kess @ 2.05.2007 21:42)
а если так?? там возведение в степень +факториал.......
Попытаюсь сделать первый проход по ошибкам (типа нулевое приближение ).
{ 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)
Это как это?? Обычно много чего можно... Но речь идет не о том, что обычно можно, а о том, что сейчас нужно!
Но это не единственная твоя ошибка..
Попытаюсь сделать первый проход по ошибкам (типа нулевое приближение ).
{ 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) не задать по желанию?.. Кстати, скажи, что именно подсказывает твое желание для задания переменной n? Допустим, преп тебе задал точность e=0.0001. Итак - каково твое желание относительно n? С нетерпением жду ответа..
Автор: 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.