Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Метод Зейделя для системы нелинейных уравнений


Автор: norman 17.4.2006, 23:08
При запуске выдаёт ошибку "Floating point operation"...хотя, я никаких немыслимых вычисленей здесь не проводил...
Если кто-нить работал с этим методом или чё-нить про него знает, помогите плиз...

Код
program metod_zaidelya;
uses crt;
var
x,y,x0,y0,e:real;

function f1 (x,y:real):real;
begin
f1:=(sin(x+y)/cos(x+y))-sqr(x)+0.1;
end;

function f2 (x,y:real):real;
begin
f2:=0.6*sqr(x)+2*sqr(y)-1;
end;

procedure solve (x0,y0,e:real); {ОШИБКА, КАК МНЕ КАЖЕТСЯ, ВОЗНИКАЕТ ВОТ В ЭТОЙ ПРОЦЕДУРЕ}
var x1,y1:real;
const k1=0.001; k2=-0.001;
begin
repeat
x1:=x0+k1*f1(x0,y0);
y1:=y0+k2*f2(x1,y0);
x0:=x1;
y0:=y1;
until abs(f1(x0,y0))+abs(f2(x0,y0))<e; {е=0.0000001}
x:=x0;
y:=y0;
end;

begin
clrscr;
write('Введите начальное приближение корня x0:');
read(x0);
write('Введите начальное приближение корня y0:');
read(y0);
write('Задайте точность вычислений e:');
read(e);
writeln;
solve (x0,y0,e);
writeln('|     x    |     y    |    e     |    f1(x,y)     |     f2(x,y)    |');
writeln('|',x:2:10,'|',y:2:10,'|',e:2:10,'|',f1(x,y):2:10,'|',f2(x,y):2:10,'|');
end.
     

Автор: Ozzя 18.4.2006, 08:08
1. Попробуй заменить  real на extended
2. Оттрассируй программу 

Автор: bsa 1.5.2006, 16:29
В функции f1 ты производишь деление на cos(x+y).
Ты уверен, что x+y <> PI/2 + PI*n (где n - целое)?
Проще говоря, возможно в какой-то момент cos(x+y) становится равным нулю. А деление на ноль - это всегда ошибка.  
Если не можешь отладить пошагово, воткни везде что-то типа writeln('f1:', x, ', ', y). Тогда будешь знать, при каких значениях x и y происходит ошибка и в какой функции. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)