GNU Octave/Rozwiązanie równania nieliniowego

Rozwiązanie równania nieliniowego

edytuj

Rozwiązać numerycznie równanie  .

Szukamy miejsc zerowych funkcji  . Utwórzmy funkcję  . W tym celu tworzymy osobny plik o nazwie P.m i treści:

function [y]=P(x)
   y=(6*x^4-x^3-7*x^2+x+1)+sin(x);
endfunction;

Rozwiązujemy równanie za pomocją funkcji fsolve, która implementuje metodę podobną do metody Newtona. Jako parametry zadajemy funkcję "P" oraz pierwsze przybliżenie miejsca zerowego, np. 0:

octave:5> x0=fsolve("P",0.0)
x0 = -0.27090

Uwaga: Octave musi widzieć plik P.m. Najłatwiej to osiągnąć, uruchamiając octave z tego samego katalogu, w którym znajduje się ten plik.

Miejscem zerowym jest  . Sprawdźmy to:

octave:7> P(x0)   
ans = 0

Zadanie tolerancji

edytuj

Szukanie miejsc zerowych przy zadanej tolerancji:

fsolve_options("tolerance", 1e-5);
fsolve("P",0.0);

Zadanie funkcji pochodnej

edytuj

Podawanie ręczne funkcji pochodnej (normalnie pochodna zostanie obliczona w sposób przybliżony):

function [y]=Pprim(x)
   y=(24*x^3-3*x^2-14*x+1) + cos(x);
endfunction;
octave:13> mz=fsolve(["P"; "Pprim"], 0.0)
mz = -0.27090

Szczegóły fsolve

edytuj

Funkcja fsolve zwraca również dodatkowe informacje:

  1. x - przybliżone miejsce zerowe
  2. info - informacja o wyniku wykonania, wartość 1 oznacza sukces,
  3. msg - komunikat dla użytkownika.
octave:19> [x,info,msg]=fsolve("sin", pi/2)
x = 40.841
info = 3
msg = iteration is not making good progress
octave:20> [x,info,msg]=fsolve("sin", pi/3)
x = 0
info = 1
msg = solution converged within specified tolerance