Numeriska metoder & Matlab

Permalänk
Medlem

Numeriska metoder & Matlab

Hej.

Jag försöker att över sommaren lära mig en del grunder inom numeriska metoder med Matlab för en kurs på universitet. Men har dykt på problem. Jag hoppas att det finns några snälla Sweclockare som kan hjälpa mig på traven! Självklart har jag själv försökt reda ut och läsa i kursbok + online om problemen men lyckas inte hitta tillräcklig information där. Det är några saker, och blir mest troligt fler, som jag behöver hjälp med men jag börjar med det första.

Har en funktion som jag skall köra genom Matlab:

Min kod i Matlab är:

Citat:

x = 0:0.001:100;

y = 98.*x - ((x.^2 + x + 0.2)./(x + 1)).^9 + 5.*x.*exp(-x);

Problemet:

Funktionen skall ge två rötter, y = 0, när x > 0 men jag kan för mitt liv inte se att jag får fler än 1 för positiva x. Jag tror att jag lyckats skriva in funktionen felaktigt i Matlab men har gått igenom den flera flera gånger om och kan inte se att det är något fel med hur jag skrivit. Kan någon se vad jag gjort fel?

Tack, mvh / euro

Permalänk
Medlem
Skrivet av hypermode:

Hej.

Jag försöker att över sommaren lära mig en del grunder inom numeriska metoder med Matlab för en kurs på universitet. Men har dykt på problem. Jag hoppas att det finns några snälla Sweclockare som kan hjälpa mig på traven! Självklart har jag själv försökt reda ut och läsa i kursbok + online om problemen men lyckas inte hitta tillräcklig information där. Det är några saker, och blir mest troligt fler, som jag behöver hjälp med men jag börjar med det första.

Har en funktion som jag skall köra genom Matlab:

Min kod i Matlab är:

Problemet:

Funktionen skall ge två rötter, y = 0, när x > 0 men jag kan för mitt liv inte se att jag får fler än 1 för positiva x. Jag tror att jag lyckats skriva in funktionen felaktigt i Matlab men har gått igenom den flera flera gånger om och kan inte se att det är något fel med hur jag skrivit. Kan någon se vad jag gjort fel?

Tack, mvh / euro

Din kod är felaktigt, den löser inte funktionen. Det som du har skrivit är 1) du har definierad variable x from 0 till 100.
2) du har definierad funktionen y som beroende på x. 3) du få utskrift där du får olika y värde beroende på x.

Du behöver hitta rätt method för att lösa den ekvation numeriskt. rätt kod ser mycket mer komplicerad än de två rader som du har skrivit. oftast i form av loops, där datorn prova sig fram ett svar med ett felgräns som du har definierad.

Här har du exempel samling från KTH, du kan hitta liknande problem och ser hur de löser problemet.
https://www.nada.kth.se/~gerd/exsamling.pdf

Grundkursboken
https://www.nada.kth.se/~gerd/bokNumAlg.pdf

Permalänk
Medlem
Skrivet av hypermode:

Hej.

Jag försöker att över sommaren lära mig en del grunder inom numeriska metoder med Matlab för en kurs på universitet. Men har dykt på problem. Jag hoppas att det finns några snälla Sweclockare som kan hjälpa mig på traven! Självklart har jag själv försökt reda ut och läsa i kursbok + online om problemen men lyckas inte hitta tillräcklig information där. Det är några saker, och blir mest troligt fler, som jag behöver hjälp med men jag börjar med det första.

Har en funktion som jag skall köra genom Matlab:

Min kod i Matlab är:

Problemet:

Funktionen skall ge två rötter, y = 0, när x > 0 men jag kan för mitt liv inte se att jag får fler än 1 för positiva x. Jag tror att jag lyckats skriva in funktionen felaktigt i Matlab men har gått igenom den flera flera gånger om och kan inte se att det är något fel med hur jag skrivit. Kan någon se vad jag gjort fel?

Tack, mvh / euro

Det var rätt längesen jag läste kursen, men det verkar som du kan lösa problemet med Newton-Raphsons method.

Permalänk
Medlem

Tack för era svar. Dock inser jag att jag kanske varit otydlig i min första post.

Mitt problem är inte att jag behöver en algoritm för att hitta en root. Utan alltså att när jag ritar upp funktionen i Matlab kan jag bara se att den skär x-axeln 1 gång och inte 2 gånger som uppgiften utgår ifrån. Något måste jag gjort fel när jag skrivit in funktionen i Matlab. Kan ni se var?

Tack, mvh / euro

Permalänk
Medlem
Skrivet av hypermode:

Tack för era svar. Dock inser jag att jag kanske varit otydlig i min första post.

Mitt problem är inte att jag behöver en algoritm för att hitta en root. Utan alltså att när jag ritar upp funktionen i Matlab kan jag bara se att den skär x-axeln 1 gång och inte 2 gånger som uppgiften utgår ifrån. Något måste jag gjort fel när jag skrivit in funktionen i Matlab. Kan ni se var?

Tack, mvh / euro

https://www.wolframalpha.com/input/?i=y+%3D+98*x+-+((x%5E2+%2...;

wolframalpha ger 2 rötter, x1=4.97087×10^-9 och x2= 1.69206. Den första rot är mindre än det steglängden som du har definerad, dvs 0.001. Därför kan du inte ser skärning med x-axeln. Om du plotta funktionen mellan 0 och 2, med 1e-9 som steg, kanske då kan du ser den första rot. observera första rot är så små kanske du behöver zooma in nära noll.

Permalänk
Medlem

Nu tycker jag Matlabs funktion /ekvations implementation är så strulig så jag orkar inte skriva ned någon kod men du kan lätt övertyga dig om att det måste finnas mer än 1 root.

För x=0 är funktionen f(x) uppenbarligen negativ, -0.2^9. Sätter du sen in x=1 och x=2 i Matlab så ser du att första värdet ger något positivt medan det andra ett negativt funktionsvärde.

Edit: Derivatian är inte alls noll nära den andra roten som jag först sa. Den ger en rätt knepig funktion och det är antagligen därför du fått denna ekvation som uppgift i Matlab.

Visa signatur

PS4 & Macbook Pro.

Utlandssvensk sedan många år. Citera för svar.

Permalänk
Medlem

Stort tack för svaren! Detta skall jag prova imorgon!! Tack igen!

Permalänk
Medlem

Nu har jag en fråga jag ej lyckas hitta något svar för, har läst igenom relaterade kapitel i de böcker jag har samt sökt på internet men ej funnit något som passar.

Jag har, enligt uppgiften, använt minstakvadratmetoden för att få en andragradsfunktion att passa in på 12 datapunkter.

Problemet:

En delfråga är att man ska nämna var man borde sluta plotta funktionen "enligt matematiken". Rent statistiskt ska man ju enbart interpolera och inte extrapolera och det är det enda jag kan tänka möjligtvis passar här för att svara på den frågan, dvs man ska starta och sluta vid den första och den sista datapunkten. Men tror ni att det är detta frågan avser? Jag blir ganska tveksam pga just "enligt matematiken".