Fixpunkt NaN
Jag får de resultat jag vill av programmeringen, MEN jag fattar inte varför det bli NaN (not a number) där derivatan borde vara positiv. Att det troligtvis går mot oändligheten fattar jag men inte varför. Kan någon förklara?
Funktionen jag använder mig av är x(n+1): -sin(2*x)+5*x/4-3/4
och programmet:
clear all, close all, clc
xstart=[-1 0 1.6 3 4.4];
format long;
for ggr=1:5
x=xstart(ggr);
differens=1;
tol=0.1e-10;
x=funk2(x);
while abs(differens)>tol
x1=funk2(x);
differens=abs(x1-x);
x=x1;
end
disp([ x differens ])
end
Svaret programmet ger:
NaN NaN
-0.544442400683579 0.000000000006039
NaN NaN
3.161826486548011 0.000000000009194
3.161826486555482 0.000000000008261
Har du kod för funktionerna
xstart()
och
funk2()
?
Dr. G skrev:Har du kod för funktionerna
xstart()
och
funk2()
?
Ok, såg fel. xstart var en vektor med startvärden.
funk2() saknas dock.
Dr. G skrev:Dr. G skrev:Har du kod för funktionerna
xstart()
och
funk2()
?
Ok, såg fel. xstart var en vektor med startvärden.
funk2() saknas dock.
funk2(x) är en funktion som hämtas från m-fil. Funktionen som hämtas och körs är den funktionen jag skrivit ut och som är fetmarkerad.
Kan tillägga att jag inte tror att det är fel på koden.
Jaha.
Prova att skriva ut
x1
differens
efter varje varv i i while-loopen.
NaN kan betyda att man har delat 0 med 0. Är det man delar med i derivataberäkningen kanske för litet?
Laguna skrev:NaN kan betyda att man har delat 0 med 0. Är det man delar med i derivataberäkningen kanske för litet?
Jo visst, men i detta fallet kan inte något delas med 0 då det varken finns 0 eller x i nämnaren.
Derivataberäkningen finns inte med då den inte är nödvändig i fixpunktsiterationen (om jag förstått det rätt)däremot nämner jag derivatan som beskrivning för var jag upptäckt felen dvs det blir NaN vid de nollpunkter där derivatan hade varit positiv för ekvationen.
Kan du klistra in funk2 här också? Annars är det svårt att felsöka.
parveln skrev:Kan du klistra in funk2 här också? Annars är det svårt att felsöka.
function [ y ] = funk2( x )
%call: [ y ] = funk2( x )
%input: x
%output: y=f(x)
y=(5/4)*x-sin(2*x)-3/4;
end
Jag körde programmet med tillägget
funk2 = @(x) -sin(2*x)+5*x/4-3/4;
och får samma resultat.
Printa ut differens i while-loopen så ser ni vad som händer.
Koden kan köras här
Dr. G skrev:Jag körde programmet med tillägget
funk2 = @(x) -sin(2*x)+5*x/4-3/4;
och får samma resultat.
Printa ut differens i while-loopen så ser ni vad som händer.
Ja det har jag redan observerat tidigare. Jag vill veta varför... kör jag ett prog med newtonsmetod får jag samtliga nollställena.
Du menar att du vill veta varför fixpunktsiterationen divergerar?
Dr. G skrev:Du menar att du vill veta varför fixpunktsiterationen divergerar?
Ja (för de nollpunkten derivatan är positiv). När derivatan är negativ konverterar den.
Set finns ett kriterium som garanterar konvergens, se t.ex längst ner på den här sidan.
Det kan vara värt att plotta ut hur iterationen konvergerar (eller inte). Här med -1 som startvärde.