[Pascal] Układ równań nieliniowych metodą Newtona

0

Witam serdecznie :)

Czy móglby ktoś z Was podać kod w Pascalu, który będzie dopowiedzią na zadnie:

ROZWIĄZAĆ UKŁAD RÓWNAŃ NIELINIOWYCH METODĄ NEWTONA

F(x,y) = x3y2 + xy + xy3 - 3 =0
G(x,y) = x2 + x2y2 - 2xy = 0

x0=1.1 y0=1.05

gdzie:
x3,y2,y3,x2 oznacza do potęgi
x0,y0 oznacza zero w indeksie dolnym

Będę baardzoo wdzięczy za pomoc :)

Pozrawiam,
Koodłaty Zbój

0

polecam zakupienie ksiazki B.Baron Metody numeryczne w delphi - tam jest caly dzial odnosnie nielionowych układów równan.
Nie mam skanera zeby to wrzucic.

0

Crowa, a jak spróbowałbyś aparatem cyfrowym?

0

Wzór jest jeden:
x(k+1) = x_k - f(x_k)/f'(x_k), k = 0, 1, ...

x i f - są tu wektorami
f' - macierz kwadratowa (jakobian), dzielenie wektora przez macierz załatwiamy tak:
v/A = Bv, gdzie B jest macierzą odwrotną do A.

Można też rozwiązywać w każdym kroku układ równań, przekształcamy wzór do postaci:
f'(x_k)*z_k = -f(x_k)

zmienna to z_k reszta to stałe.
oczywiście: z_k = x(k+1) - x_k,
więc po obliczeniu podstawiamy: x(k+1) = x_k + z_k, i już mamy kolejne przybliżenie,
powtarzamy tak aż |z_k| będzie bliskie zero, np. |z_k| < 1e-6

W naszym przypadku: f' =
3x3y2 + y + y3 2x3y + x + 3xy2
2x + 2xy2 - 2y 2x2y - 2x

wstawiasz k = 0, x = x0, y = y0 -> teraz obliczasz z0, itd.

0

macierz odwrotna mozna zrobic stosujac eliminacje Gaussa lub Crouta.

0

Metoda Newtona+algorytm

http://www.i-lo.tarnow.pl/edu/inf/alg/zmzf/index.htm

// Program znajduje miejsce zerowe funkcji f(x)
// za pomocą algorytmu Newtona
//---------------------------------------------
// (C)2006 mgr J.Wałaszek       I LO w Tarnowie

program mzf1;

{$APPTYPE CONSOLE}

uses math;

const
  EPS0 = 0.0000000001; // dokładność porównania z zerem
  EPSX = 0.0000000001; // dokładność wyznaczenia pierwiastka

// Funkcja, której miejsce zerowe obliczamy
// f(x) = x^3*(x+sin(x^2-1)-1)-1
// <-1,0> i <1,2>
//-----------------------------------------
function f(x : real) : real;
begin
  Result := x * x * x * (x + sin(x * x - 1) - 1) - 1;
end;

// Oblicza pochodną funkcji f(x)
// f'(x) =2x^4*COS(x^2 - 1) + 3x^2*SIN(x^2 - 1) + 4x^3 - 3x^2
//-----------------------------------------------------------
function fp(x : real) : real;
begin
  Result := x * x * (2 * x * x * cos(x * x - 1) + 3 * sin(x * x - 1) + 4 * x - 3)
end;

//-----------------------------------------------------
// Program główny
//-----------------------------------------------------

var
  x0,x1,f0,f1 : real;
  i           : integer;

begin
  writeln('Obliczanie pierwiastka funkcji - metoda Newtona');
  writeln('f(x) = x^3*(x+sin(x^2-1)-1)-1');
  writeln('-----------------------------------------------');
  writeln('(C)2006 mgr Jerzy Walaszek      I LO w Tarnowie');
  writeln;
  write('Podaj punkt startowy x0 = '); readln(x0);
  writeln;
  writeln('-----------------------------------------------');
  writeln('WYNIK:');
  writeln;
  x1 := x0 - 1; f0 := f(x0); i := 64;
  while (i > 0) and (abs(x1 - x0) > EPSX) and (abs(f0) > EPS0) do
  begin
    f1 := fp(x0);
    if abs(f1) < EPS0 then
    begin
      writeln('Zly punkt startowy');
      i := 0;
      break;
    end;
    x1 := x0;
    x0 := x0 - f0 / f1;
    f0 := f(x0);
    dec(i);
    if i = 0 then writeln('Przekroczony limit obiegow');
  end;
  if i > 0 then writeln('x0 = ',x0:15:8);
  writeln;
  writeln('-----------------------------------------------');
  writeln('Koniec. Nacisnij klawisz Enter...');
  readln;
end.
0

Może nie na temat, ale nie powino być w "Nietuzinkowych tematach"?

0
crowa napisał(a)

polecam zakupienie ksiazki B.Baron Metody numeryczne w delphi - tam jest caly dzial odnosnie nielionowych układów równan.
Nie mam skanera zeby to wrzucic.

Hmm, książka jest droga. Nie wiecie gdzie można ją uzyskać w formie elektronicznej?

1 użytkowników online, w tym zalogowanych: 0, gości: 1