Помощь - Поиск - Пользователи - Календарь
Полная версия: Вычислить 20 значений функций.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Crazy R
Вобщем задача такая:
Для аргумента , изменяющегося от –0.6 с шагом 0.05 вычислить 20 значений функций.
Вычислить значения функций f1(x) и f2(x) для значений аргументов, указанных в вариантах заданий № 1 – 30 по первой работе. Функцию f2(x) вычислить для ряда точностей . Для указанных точностей определить количество N элементов ряда, суммируемых для достижения заданной точности. Результаты расчетов свести в следующую таблицу.
Нажмите для просмотра прикрепленного файла

И вот что я тут нарешал:


uses
  crt;

Const
eps1 = 0.01;	   { Точность 10-2}
eps2 = 0.01;	  { Точность 10-3 }
eps3 = 0.001;	 { Точность 10-4 }
a = -0.6;		   { Начальное значение Х}
b = 0.05;		   { Шаг}
N = 20;			 { Количество значений функции }
Var
k1, k2, k3, i: Integer; {Вспомогательные переменные}
f1, f2_1, f2_2, f2_3, step, slag, x: Real;

 begin
 ClrScr;
{Рисуется шапка таблицы}
 writeln('___________________________________________________________');
 writeln('|	   |			 | e=0.01   |  e=0.001  |  e=0.0001  |');
 writeln('|	x  |	f1(x)	|----------|-----------|------------|');
 writeln('|	   |			 | f2(x)| N | f2(x) | N |  f2(x) | N |');
 writeln('|_______|_____________|______|___|_______|___|________|___|');
 x := a;  {Начальное значение Х}
 for i:=1 to N do
  f1:=((exp(3*ln(x)))/12)+(((exp(4*ln(x)))-1)/16)*abs(ln((1+x)/(1-x))-2*arctan(x));
  step:=x;  {Начальное значение степени Х}
   f2_1:=0;  {Начальное значение функции f2_1}
   k1:=0;
   repeat	 {Итерационный цикл для точности 10-2}
	 inc(k1);
	 step:=Exp(ln(x)*(4+K1+7));					 {Наращивается степень}
	 slag:=step/((4*k1+3)*(4*k1+7));	{Считается очередное слагаемое}
	 f2_1:=f2_1+slag;				{Считается значение f2_1}
   until abs(slag)<=eps1;  {Выход из цикла, когда слагаемое становится меньше точности 10-2}
   f2_2:=f2_1;
   k2:=k1;
   repeat			   {Итерационный цикл для точности 10-3}
	 inc(k2);
	 step:=Exp(ln(x)*(4+K2+7));				{Наращивается степень}
	 slag:=step/((4*k2+3)*(4*k2+7));	{Считается очередное слагаемое}
	 f2_2:=f2_2+slag;
   until abs(slag)<=eps2;  {Выход из цикла, когда слагаемое становится меньше точности 10-3}
   f2_3:=f2_2;
   k3:=k2;
   repeat						 {итерационный цикл для точности 10-4}
	 inc(k3);
	 step:=Exp(ln(x)*(4+K3+7));				{Наращивается степень}
	 slag:=step/((4*k3+3)*(4*k3+7));  {Считается очередное слагаемое}
	 f2_3:=f2_3+slag;
   until abs(slag)<=eps3; {Выход из цикла, когда слагаемое становится меньше точности 10-4}
{ Вывод результатов}
   writeln('| ', x:5:2,' | ',f1:12:9,'| ',f2_1:5:2,'| ',
   k1:2,'| ',f2_2:6:3,'| ',k2:2,'| ',f2_3:7:4,'| ', k3:2,'|');
   x:=x+b;

{ завершение таблицы }
 write('-------------------------------------------------------------------');

readkey;
end.


Выдаёт ошибку.help me.
volvo
26 строка:
Цитата
f1:=((exp(3*ln(x)))/12)+(((exp(4*ln(x)))-1)/16)*abs(ln((1+x)/(1-x))-2*arctan(x));
- проблемная. Ln(X) при X = -0.6 даст тебе ошибку. Теперь ты знаешь, ГДЕ и ПОЧЕМУ возникает ошибка. Переделывай.
Crazy R
Цитата(volvo @ 6.12.2009 16:46) *

26 строка: - проблемная. Ln(X) при X = -0.6 даст тебе ошибку. Теперь ты знаешь, ГДЕ и ПОЧЕМУ возникает ошибка. Переделывай.

можно заменить эту строку такой но
 ((x*x*x)/12+0.0625*((x*x*x*x)-1))*((Ln((1+x)/(1-x)))-(arctan(x)));

из-за (1+x)/(1-x) всеравно получиться ошибка.
volvo
Цитата
из-за (1+x)/(1-x) всеравно получиться ошибка.
Неправда, не будет там ошибки, отрицательного значения под логарифмом нет. Ошибка будет ниже по тексту, там, где ты опять возводишь X в степень 4*k1+3. Возводи по-другому, не через эту формулу.
Crazy R
Цитата(volvo @ 6.12.2009 17:33) *

Неправда, не будет там ошибки, отрицательного значения под логарифмом нет. Ошибка будет ниже по тексту, там, где ты опять возводишь X в степень 4*k1+3. Возводи по-другому, не через эту формулу.


smile.gif ну да)
Спасибо буду пробовать завтра (сегодня уезжаю:() отпишу как что получиться
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.