![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Jabbson |
![]() ![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Арсений Репутация: ![]() ![]() ![]() |
Помогите, пожалуйста, с лабой. Попробовал сам - но у меня откуда-то получается деление на ноль. (я думаю, я превысил размер заданного типа. (На всякий случай тоже прикрепил, но только расчет сигмы).
ФУНКЦИИ ![]() Для аргумента 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.
|
![]() ![]() |
volvo |
![]()
Сообщение
#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}
![]() |
Jabbson |
![]()
Сообщение
#3
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Арсений Репутация: ![]() ![]() ![]() |
Владимир, огромное спасибо Вам,
![]() Сообщение отредактировано: Jabbson - 10.11.2009 21:05 |
![]() ![]() |
![]() |
Текстовая версия | 7.08.2025 4:29 |