GNU Octave/Rozwiązanie równania nieliniowego
Z Wikibooks, biblioteki wolnych podręczników.
Spis treści |
[edytuj] Rozwiązanie równania nieliniowego
Rozwiązać numerycznie równanie (6x4 − x3 − 7x2 + x + 1) + sin(x) = 0.
Szukamy miejsc zerowych funkcji P(x) = (6x4 − x3 − 7x2 + x + 1) + sin(x). Utwórzmy funkcję P. 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
[edytuj] Zadanie tolerancji
Szukanie miejsc zerowych przy zadanej tolerancji:
fsolve_options("tolerance", 1e-5);
fsolve("P",0.0);
[edytuj] Zadanie funkcji pochodnej
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
[edytuj] Szczegóły fsolve
Funkcja fsolve zwraca również dodatkowe informacje:
- x - przybliżone miejsce zerowe
- info - informacja o wyniku wykonania, wartość 1 oznacza sukces,
- 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