14 svar
183 visningar
Louiger 470
Postad: 13 nov 2019 16:03 Redigerad: 13 nov 2019 16:04

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

Dr. G 9479
Postad: 13 nov 2019 16:34

Har du kod för funktionerna

xstart()

och

funk2()

?

Dr. G 9479
Postad: 13 nov 2019 16:55
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. 

Louiger 470
Postad: 13 nov 2019 17:06 Redigerad: 13 nov 2019 17:07
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. 

Dr. G 9479
Postad: 13 nov 2019 17:30

Jaha.

Prova att skriva ut 

x1 

differens

efter varje varv i i while-loopen.

Laguna Online 30482
Postad: 13 nov 2019 17:51

NaN kan betyda att man har delat 0 med 0. Är det man delar med i derivataberäkningen kanske för litet? 

Louiger 470
Postad: 13 nov 2019 18:13
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. 

parveln 703 – Fd. Medlem
Postad: 13 nov 2019 18:21

Kan du klistra in funk2 här också? Annars är det svårt att felsöka.

Louiger 470
Postad: 13 nov 2019 18:47
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

Dr. G 9479
Postad: 13 nov 2019 18:50

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. 

Dr. G 9479
Postad: 13 nov 2019 18:53

Koden kan köras här

Louiger 470
Postad: 13 nov 2019 19:08
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.

Dr. G 9479
Postad: 13 nov 2019 19:17

Du menar att du vill veta varför fixpunktsiterationen divergerar?

Louiger 470
Postad: 13 nov 2019 19:20 Redigerad: 13 nov 2019 19:22
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.

Dr. G 9479
Postad: 14 nov 2019 17:19

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.

Svara
Close