CV5-6  - Newtonova iterační  metoda

Program newton pro výpočet řešení nelineární rovnice f(x)=0 Newtonovou  metodou

\(newton[f_, x0_, max_, eps_] := 
      Module[{x1, xn, s, i, x, z}, 
	\ \ i = 0; 	
        Print[\*""iterace    \!\(x\_\(\(n\)\(\\ \)\)\)         (Subscript[s, n])""]; 
		Print["   ", i, "      ", N[x0, 8]]; 
\ \ \ \ x1 = 
          x0; 
		s = 999999; 
		x = {x0}; 
		While[
          i < max\ \  && \ s > eps, 
				xn = 
            z - f[z]/\(f'\)[z] /. z -> x1; 
				s = 
            Abs[xn - x1]; 
				\(i++\); 
				Print["   ", 
            i, "      ", N[xn, 8], "       ", 
            N[s, 8]]; 
				x1 = N[xn, 15]; 
	\ \ \ \ 	x = 
            Join[x, {x1}];]; 
		Print["Výsledek"]; 
		Print[
          N[x1, 8]];
	]\)

Použítí programu newton a FindRoot pro výpočet řešení nelineární rovnice

Příklad 1:
Mějme rovnici (x^2)-2x = 0

Definujme funkci f(x)=(x^2)-2x

f[x_] = x x - 2 x;

Řešme rovnici Newtonovou metodou pomocí našeho programu nevton. Zvolme počáteční aproximaci (Subscript[x, 0]) = 5, maximální počet iterací 10 a ε=(10^(-4))

newton[f, 5, 10, 0.0001]

Zvolme počáteční aproximaci (Subscript[x, 0]) = -1, maximální počet iterací 10 a ε=(10^(-4))

newton[f, -1, 10, 0.0001]

Nyní použijeme vestavěnou funkci pro hledání kořene nelineární rovnice s počáteční aproximaci (Subscript[x, 0]) = 5 a  (Subscript[x, 0]) = -1.

FindRoot[f[x] == 0, {x, 5}]

FindRoot[f[x] == 0, {x, -1}]

Příklad 2:
Mějme rovnici (x^3)-4(x^2)+6x-5 = 0

Definujme funkci f(x)=(x^3)-4(x^2)+6x-5

f[x_] = x x x - 4 x x + 6 x - 5;

Řešme rovnici Newtonovou metodou pomocí našeho programu nevton. Zvolme počáteční aproximaco (Subscript[x, 0]) = 5, maximální počet iterací 10 a ε=(10^(-4))

newton[f, 5, 10, 0.0001]

Nakreslíme si graf, abychom zjistili, kolik kořenů rovnice má.

Plot[f[x], {x, -10, 10}]

Plot[f[x], {x, 1, 3}]

FindRoot[f[x] == 0, {x, 5}]

Příklad 3:
Mějme rovnici (e^(x - x - 2)) = 0

Definujme funkci f(x)=(e^(x - x - 2))

f[x_] = Exp[x] - x - 2;

Řešme rovnici Newtonovou metodou pomocí našeho programu nevton. Zvolme počáteční aproximaco (Subscript[x, 0]) = 1, maximální počet iterací 10 a ε=(10^(-4))

newton[f, 1, 10, 0.0001]

Nakreslíme si graf, abychom zjistili, kolik kořenů rovnice má.

Plot[f[x], {x, -10, 5}]

Plot[f[x], {x, -3, 2}]

Rovnice má asi dva kořeny.

Zvolme počáteční aproximaco (Subscript[x, 0]) = -1, maximální počet iterací 10 a ε=(10^(-4))

newton[f, -1, 10, 0.0001]

FindRoot[f[x] == 0, {x, 1}]

FindRoot[f[x] == 0, {x, -1}]

Program newton pro výpočet řešení soustavy nelineárních rovnic (Overscript[f, ⇀])((Overscript[x, ⇀]))=(Overscript[0, ⇀]) Newtonovou  metodou

\(newtonsous[f_, z_, x0_, max_, 
        eps_] := \ \(Module[{x1, xn, s, i, x, prs, res, j, jak, jak0, 
            y}, 
{
	
            n = Length[z]; 
	\ i = 
              0; 
Print[\*""iterace     \!\(x\_\(\(n\)\(\\ \)\)\)               (Subscript[s, n])""]; 
	
            Print["   ", i, "       ", 
              N[x0, 8]]; 
\ 
            x1 = x0; 
s = 
              999999; 
x = {x0}; 
While[
              i < max\ \  && \ s > eps, 
	
              jak = Outer[D, f, z] /. 
                  Thread[Rule[z, x1]]; 
	
              prs = f /. 
                  Table[z[\([j]\)] -> x1[\([j]\)], {j, 1, 
                      n}]; 
	
              res = LinearSolve[jak, \(-prs\)]; 
	
              xn = x1 + res; 
	
              s = Sqrt[
                  res . res]; 
	\(i++\); 
	
              Print["   ", i, "       ", 
                N[xn, 8], "             ", N[s, 8]]; 
	
              x1 = N[xn, 8]; 
	
              x = Join[
                  x, {x1}];]; 
Print["Výsledek"]; 
	
            Print[N[x1, 8]];
	}]\)[\([1]\)]\)

Použítí programu newtonsous a FindRoot pro výpočet řešení soustav nelineárních rovnic

Příklad 4:
Mějme soustavu rovnici (x^2)+ x - y + 1 = 0
                                     x + xy - 2      = 0

Definujme vektorovou funkci f(x,y)=[(x^2)+ x - y + 1 ,  x + xy - 2]

f[x_, y_] = {x x + x - y + 1, x + x y - 2};

Řešme soustavu Newtonovou metodou pomocí našeho programu nevtonsous. Zvolme počáteční aproximaci [(Subscript[x, 0]), (Subscript[y, 0])] = [1, 
          1], maximální počet iterací 10 a ε=(10^(-4))

newtonsous[f[x, y], {x, y}, {1, 1}, 10, 0.0001]

Nyní použijeme vestavěnou funkci pro hledání kořene nelineární rovnice s počáteční aproximaci [(Subscript[x, 0]), (Subscript[y, 0])] = [1, 1] .

FindRoot[{x*x + x - y + 1 == 0, x + x*y - 2 == 0}, {x, 1}, {y, 
        1}]

Graficky se přesvědčíme, že soustava má jen jedno řešení.

<< Graphics`ImplicitPlot`

ImplicitPlot[{f[x, y][[1]] == 0, f[x, y][[2]] == 
          0}, {x, -10, 10}, PlotRange -> {-5, 5}, 
      PlotPoints -> 100]

ImplicitPlot[{f[x, y][[1]] == 0, f[x, y][[2]] == 
          0}, {x, 0, 10}, PlotRange -> {-5, 5}, 
      PlotPoints -> 100]

Program newtonsous lze použít také pro jednu rovnici

Příklad 5:
Mějme soustavu rovnici (x^2)+ 5x+ 6 = 0

f[x_] = x*x + 5*x + 6;

newtonsous[{f[x]}, {x}, {1}, 10, 0.0001]

newtonsous[{f[x]}, {x}, {-5}, 10, 0.0001]

FindRoot[f[x] == 0, {x, 1}]

FindRoot[f[x] == 0, {x, -5}]