Permalänk
Medlem

Ekvationslösare i Matlab

Hej!

Jag ska skriva en ekvationslösare i Matlab som skall kunna hitta nollställen till en given funktion med en given startgissning. Jag måste använda mig av Newton-Raphsons metod vilket inte är speciellt komplicerat. Problem uppkommer däremot när man skall undersöka lite specialfunktioner, t.ex. x^2-4x där derivatan är 0 då x = 2. Om man har startgissning x = 2 så kommer metoden inte hitta något nollställe trots att det finns två stycken (0 och 4). Det finns fler exempel på Wikipedia under rubriken Failure analysis.

Är det någon som vet om det finns något man kan lägga till i koden för att gå förbi de problemen som nämns på Wikipedias sida eller är det helt enkelt kört?

Det enda jag kommit på är att lägga till ett slumptal till nämnaren för att slippa att få en nämnare som hamnar på 0. Däremot kommer då samma funktion få olika antal iterationer för att hitta ett nollställe. Lösningen är inte så snygg men den funkar.

Tack på förhand
/Emil

Permalänk
Medlem

Vore väl ganska enkelt i detta fallet att kolla om din startgissning blev 0 så tar programmet och testar med din startgissning +/- ett litet tal.

Orkade inte läsa wiki artikeln men detta borde lösa problemet du beskriver iaf...

Permalänk
Medlem

Jo, det är ju det jag beskrev med att jag lägger till ett slumptal till nämnaren om derivatan i punkten skulle vara 0. Men det är ju inte en jättesnygg lösning eftersom det då kommer vara olika många iterationer vid olika körningar av samma funktion med samma startgissning. Jag kör nog på det ändå, det fungerar ju fast det kanske inte är så optimalt.

Permalänk
Hedersmedlem

För att få ett mer förutsägbart resultat skulle du kunna sätta en maxgräns på antal iterationer innan du ska ha nått en given noggrannhet (=skillnad mellan två på varandra följande iterationer). Om det inte lyckats efter det antalet iterationer så börjar algoritmen om med addition av ett slumptal.

På detta sätt så kommer slumpen bara påverka de funktioner/startvärden som inte konvergerar tillräckligt snabbt/alls. Det är möjligt detta redan är gjort, men det framgår inte isf.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Det här är ju en konsekvens av att du använder Newton-Rhapson. Antingen får du använda en annan (bättre) metod, eller (om din uppgift är att implementera just Newton-Rhapson) så får du stå ut med felen.

Permalänk
Medlem

Tack för idén att lägga till ett slumptal om det går för många iterationer. Det löser delvis problemet som uppkommer då iterationerna kommer in i en oändlig loop. Jag kör vidare på min egna lösning vad gäller en derivata som är lika med 0. Kvar är bara sista problemet på wiki-sidan men det tar jag itu med imorrn!