Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2009, 13:28   #1
Igomax
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 36
По умолчанию Производные паскаль

Нужно вычислить 1 и2 производные следующих функций -4*ctg^3(x) и (e^x-e^-x)/(e^x+e^-x)

Вот что у меня получилось
Код:
program gra;
const
 epsilon=0.0001;
type func=function(x:real):real;
var z,z2,y,y2,x:real;   {$f+}
function f1(x:real):real;
begin
f1:=-4*(cos(x)/sin(x))*(cos(x)/sin(x))*(cos(x)/sin(x));  тут пишет ошибку division by zero
end;
function f2(x:real):real;
begin
 f2:=(exp(x)-exp(-x))/(exp(x)+exp(-x));
end;

function fdx(f:func; a:real; eps:real):real;
var x1,x2,y1,y2:real;
    i,p:longint;
begin
 i:=1;
 p:=-1;
 x1:=a+5;
  y1:=f(x1);
  repeat
   y2:=y1;
   x2:=x1;
   p:=p*(-1);
   x1:=(p/i)+a;
   y1:=(f(x2)-f(x1))/(x2-x1);
   i:=i+1;
  until abs(y1-y2)<eps;
  fdx:=y2;
 end;

function fdx2(f:func; a:real; eps:real):real;
var x1,x2,y1,y2:real;
    i,p:longint;
begin
 i:=1;
 p:=-1;
 x1:=a+5;
 y1:=f(x1);
   repeat
   y2:=y1;
   x2:=f(x1)/x1;
   p:=p*(-1);
   x1:=(p/i)+a;
   y1:=(fdx(f,x2,eps)-fdx(f,x1,eps))/(x2-x1);
   i:=i+1;
  until abs(y1-y2)<eps;
  fdx2:=y2;
 end;
begin
z:=fdx(f1,1,epsilon);
y:=fdx(f2,5,epsilon);
z2:=fdx2(f1,1,epsilon);
y2:=fdx2(f2,5,epsilon);
write (z:10:5, z2:10:5, y:10:5, y2:10:5);
end.
Как её исправить?

Последний раз редактировалось Igomax; 10.10.2009 в 13:33.
Igomax вне форума Ответить с цитированием
Старый 10.10.2009, 13:36   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Код:
if sin(x)<>0 then
f1:=-4*(cos(x)/sin(x))*(cos(x)/sin(x))*(cos(x)/sin(x));
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 10.10.2009, 13:40   #3
Igomax
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 36
По умолчанию

Цитата:
Сообщение от russian-stalker Посмотреть сообщение
Код:
if sin(x)<>0 then
f1:=-4*(cos(x)/sin(x))*(cos(x)/sin(x))*(cos(x)/sin(x));
От этого программа зависает и всё
Igomax вне форума Ответить с цитированием
Старый 10.10.2009, 13:46   #4
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Ну ошибку то исправляет, если зависает, значит условие цикла не выполняется, проверьте ещё раз циклы
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 10.10.2009, 14:21   #5
Igomax
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 36
По умолчанию

Не могу найти что неправильно
Igomax вне форума Ответить с цитированием
Старый 10.10.2009, 14:24   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

деление на ноль тут ошибка...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.10.2009, 14:28   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Igomax
until abs(y1-y2)<eps
Здесь не ошиблись? repeat until <условие> - цикл, который можно прочесть как "делать, пока <условие> не будет выполнено".
То есть
repeat
i := i + 1;
until i = 10;
Будет увеличивать i до тех пор, пока оно не станет равным 10
netrino вне форума Ответить с цитированием
Старый 10.10.2009, 14:38   #8
Igomax
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 36
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Здесь не ошиблись? repeat until <условие> - цикл, который можно прочесть как "делать, пока <условие> не будет выполнено".
То есть
repeat
i := i + 1;
until i = 10;
Будет увеличивать i до тех пор, пока оно не станет равным 10
Тут нет ошибка т.к. мне нужно добиться точности вычисления 0.00001
Igomax вне форума Ответить с цитированием
Старый 10.10.2009, 14:39   #9
Igomax
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 36
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
деление на ноль тут ошибка...
Это понятно, но что надо изменить чтобы её не было?
Igomax вне форума Ответить с цитированием
Старый 10.10.2009, 17:21   #10
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Я во втором посту написал как избавится от ошибки деления на ноль,
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль, Борланд Паскаль-в чем разница??? Vremya-Dengy Паскаль, Turbo Pascal, PascalABC.NET 13 31.05.2011 18:23
класс employee и производные классы olik83 Общие вопросы C/C++ 7 21.09.2009 22:44
паскаль Александр ето я Паскаль, Turbo Pascal, PascalABC.NET 0 20.05.2009 12:18
С++ Производные классы (Ошибка) Sweta Помощь студентам 9 23.04.2008 12:58
базовые и производные классы (В чём моя ошибка) umnix Общие вопросы C/C++ 5 01.12.2007 17:26