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

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

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

 
 Ответить  Открыть новую тему 
> Значение функции для ряда точностей.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Арсений

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


Помогите, пожалуйста, с лабой. Попробовал сам - но у меня откуда-то получается деление на ноль. (я думаю, я превысил размер заданного типа. (На всякий случай тоже прикрепил, но только расчет сигмы).

ФУНКЦИИ
Прикрепленное изображение

Для аргумента X, изменяющегося от 0 с шагом 0.04 вычислить 20 значений функций:

Функцию f2(x) вычислить для ряда точностей - е=0.01, е=0.001, е=0.0001. Для указанных точностей определить количество N элементов ряда, суммируемых для достижения заданной точности. При составлении алгоритма использовать рекуррентные зависимости между соседними компонентами итераций (каждый член итерационного ряда считать через предыдущий член). Результаты расчетов свести в таблицу.

Вот тут есть пример, как подобное делается, но пример гораздо проще, без факториалов и степеней.
docs.google.com/Doc?docid=0AWCsLtJmOPr4ZGQ2dDlucnRfNWNwbTI3Mmc2&hl=en

Заранее спасибо.

program fun;

const
eps1 = 0.01;
eps2 = 0.001;
eps3 = 0.0001;
a = 0;
b = 0.04;
N = 20;

Var
z,stmn,k1, k2, k3, i, fac2_2, fac1, fac2: Integer;
fac1_1, mnoj,x, f1, f2_1, f2_2, f2_3, func1, func2, func3, step, step1, step2, slag : Real;

begin
x := a; {Начальное значение Х}
for i := 1 to N do
begin
f1:=ln(1+sqrt(1+sqr(x))); {значение функции f1}
{далее вычисляется f2}

{-----------Итерационный цикл для точности 10-2-------------}
k1:=0;
func1:=0;

repeat
inc(k1);

if (k1 mod 2)=0 then {вычисляю степень числа -1}
step:=1
else
step:=-1; {1 если степень четная и -1 если степень нечетная}

fac1_1:=1; { вычисляю факториал (2k-1)! }
fac1:=2*k1-1;
repeat
fac1_1:=fac1_1*fac1;
fac1:=fac1-1;
until fac1=0; {fac1_1 - мой полученный факториал}

step1:=exp(ln(2)*(2*k1)); {step1 - результат 2^2k}

fac2_2:=1; { вычисляю факториал k! }
fac2:=k1;
repeat
fac2_2:=fac2_2*fac2;
fac2:=fac2-1;
until fac2=0; {fac2_2 - мой полученный факториал}

step2:=fac2_2*fac2_2; {вычисляю степень (k!)^2}

stmn:=2*k1; {вычисляю множитель после дроби}
mnoj:=1;
for z:=1 to stmn do mnoj:=mnoj*x; {mnoj - мой множитель}

slag:=(step*fac1_1*mnoj)/(step1*step2);
func1:=func1+slag;
until abs(func1)<=eps1;
{-----------Итерационный цикл для точности 10-2-------------}
{-----------Итерационный цикл для точности 10-3-------------}
k2:=k1;
func2:=func1;
repeat
inc(k2);

if (k2 mod 2)=0 then {вычисляю степень числа -1}
step:=1
else
step:=-1; {1 если степень четная и -1 если степень нечетная}

fac1_1:=1; { вычисляю факториал (2k-1)! }
fac1:=2*k2-1;
repeat
fac1_1:=fac1_1*fac1;
fac1:=fac1-1;
until fac1=0; {fac1_1 - мой полученный факториал}

step1:=exp(ln(2)*(2*k2)); {step1 - результат 2^2k}

fac2_2:=1; { вычисляю факториал k! }
fac2:=k2;
repeat
fac2_2:=fac2_2*fac2;
fac2:=fac2-1;
until fac2=0; {fac2_2 - мой полученный факториал}

step2:=fac2_2*fac2_2; {вычисляю степень (к!)^2}

stmn:=2*k2; {вычисляю множитель после дроби}
mnoj:=1;
for z:=1 to stmn do mnoj:=mnoj*x; {mnoj - мой множитель}

slag:=(step*fac1_1*mnoj)/(step1*step2);
func2:=func2+slag;
until abs(func2)<=eps2;
{-----------Итерационный цикл для точности 10-3-------------}
{-----------Итерационный цикл для точности 10-4-------------}
k3:=k2;
func3:=func2;
repeat
inc(k3);

if (k3 mod 2)=0 then {вычисляю степень числа -1}
step:=1
else
step:=-1; {1 если степень четная и -1 если степень нечетная}

fac1_1:=1; { вычисляю факториал (2k-1)! }
fac1:=2*k3-1;
repeat
fac1_1:=fac1_1*fac1;
fac1:=fac1-1;
until fac1=0; {fac1_1 - мой полученный факториал}

step1:=exp(ln(2)*(2*k3)); {step1 - результат 2^2k}

fac2_2:=1; { вычисляю факториал k! }
fac2:=k3;
repeat
fac2_2:=fac2_2*fac2;
fac2:=fac2-1;
until fac2=0; {fac2_2 - мой полученный факториал}

step2:=fac2_2*fac2_2; {вычисляю степень (к!)^2}

stmn:=2*k3; {вычисляю множитель после дроби}
mnoj:=1;
for z:=1 to stmn do mnoj:=mnoj*x; {mnoj - мой множитель}

slag:=(step*fac1_1*mnoj)/(step1*step2);
func3:=func3+slag;
until abs(func3)<=eps3;
{-----------Итерационный цикл для точности 10-4-------------}
x:=x+b;
end;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Ты каждый раз вычисляешь всю формулу? Решение задачи на ряды начинается не с этого. А с того, что тебе надо выяснить, что надо сделать с элементом Sk-1, чтоб он стал элементом Sk. Что для этого надо сделать? Правильно, разделить
[(-1)(k-1) * (2(k-1) - 1)! * X2(k-1)] / [22(k-1) * ((k-1)!)2] на
[(-1)k * (2k - 1)! * X2k] / [22k * (k!)2]

Получаем, что Sk = Sk-1 * [(-1) * (2k - 2)*(2k - 1) * X2] / [22 * k2]

Вот и все. Теперь начинаешь считать с S1 = ((-1) * 1! * X2) / (22 * (1!)2), и домножаешь это на полученный выше множитель для получения Sk из Sk-1, и суммируешь все члены, до тех пор, пока очередной из них не станет по модулю меньше погрешности...

А при твоем способе - неудивительно, что ты вылетаешь за границы типов.

Добавлено через 6 мин.
Кстати, если интересно - вылетает у тебя вот тут:
Цитата
     step2:=fac2_2*fac2_2; {вычисляю степень (к!)^2}
. А почему - потому что Паскалю неинтересно, что ты результат присваиваешь в переменную типа real, операция производится с двумя Integer-ами, так что если результат в Integer не помещается (а он не помещается) - то происходит аварийное завершение программы. А вот когда уже значение вычислено - оно преобразуется в Real... Ну, можно, конечно, домножить fac2_2*fac2_2 на 1.0, тогда сразу все будет выполняться в real, и вылета в этом месте не будет (угу, будет вылет в другом месте, на 4 строки выше), но исправлять программу все равно надо smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Арсений

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


Владимир, огромное спасибо Вам, good.gif сейчас сяду, попробую написать новое "сочинение" на тему почему я люблю высшую математику, совмещенную с паскалем. Нет, на самом деле это очень познавательно и нужно. Просто только начал, еще не втянулся на 100%. Еще раз спасибо.

Сообщение отредактировано: Jabbson -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 16.04.2024 15:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name