Помощь - Поиск - Пользователи - Календарь
Полная версия: Значение функции для ряда точностей.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Jabbson
Помогите, пожалуйста, с лабой. Попробовал сам - но у меня откуда-то получается деление на ноль. (я думаю, я превысил размер заданного типа. (На всякий случай тоже прикрепил, но только расчет сигмы).

ФУНКЦИИ
Нажмите для просмотра прикрепленного файла

Для аргумента 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
Ты каждый раз вычисляешь всю формулу? Решение задачи на ряды начинается не с этого. А с того, что тебе надо выяснить, что надо сделать с элементом 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
Jabbson
Владимир, огромное спасибо Вам, good.gif сейчас сяду, попробую написать новое "сочинение" на тему почему я люблю высшую математику, совмещенную с паскалем. Нет, на самом деле это очень познавательно и нужно. Просто только начал, еще не втянулся на 100%. Еще раз спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.