Skrivet av kangarooster:
function xprim = testdiff (t,x)
xprim = [C*sin(x(1)); x(2)];
end
Du har tappat ett minustecken innan C, men framför allt så ska du byta på indexen 1 och 2. Det är det stora logiska felet i din kod. Index 1 representerar ju v (eftersom du har skrivit uttrycket för v ′ som första element) och index 2 u.
Att indexen är "blandade" så att index 2 refererar till x(1) och vice versa är det som gör att ekvationerna är kopplade. Just nu löser `ode45` två separata system samtidigt, varav inget är av intresse.
Skrivet av kangarooster:
[t,X1]=ode45('testdiff',[0 5],[pi/4 0]); %[0 5] är intervallet, [pi/4 0] är begynnelse värden.
"Fnuttarna" ser jag ingen anledning till, och är rent ut sagt förvånad att/om det fungerar utan att Matlab klagar med mycket röd text. Du har också blandat ihop ordningen på begynnelsevärdena. Systemet är lösbart ändå, och kommer utvecklas med samma ungefärliga karakteristik, men om y börjar på 0 när du plottar så ser du att du uppenbarligen har fel enligt givna villkor. Sådana kontroller bör alltid göras när man väl har en bild klar.
Skrivet av kangarooster:
Jag kan ha skrivit fel i matlab. Ska jag vara helt ärlig förstår jag inte vad jag gör.
Ytterst vanligt under matematikutbildning .
Skrivet av kangarooster:
Dock blir det fel. Jag tror det ska något annat istället för x(2), för y1 ger 0 för alla t. u'(t) = v = vad? y' finns ju inte i den ordinarie ekvationen.
Du ska som sagt byta på indexen samt begynnelsevärden, ta bort fnuttarna från funktionsnamnet och sätta in ett minus på ett bra ställe. Jag tror det är allt som felar, från det jag kan se. Approachen är helt rätt i övrigt.
—
Ett försök att förklara vad som händer: du vill skriva
y ″ + C sin y = 0
y (0) = π/4 (du skrev π/3 ovan, men π/4 i dina kodexempel)
y ′ (0) = 0
som ett system av två första ordningens differentialekvationer.
Som du säger så ska du göra substitutionen
y ′ = v
vilket blir en av dina ekvationer (än har vi inte "gjort något", utan bara "definierat något"). Den andra kommer från att skriva in denna substitution i din originalekvation:
v ′ = −C sin y
(vi har fortfarande egentligen bara definierat saker). Notera att båda ekvationerna är av första ordningen, och att de beror "diagonalt" på varandra: y ′ beror på v, och v ′ beror på y.
Vad Matlab anbelangar så vill det ha en vektor med dessa ekvationer för att kunna kötta på med sin lösare. För att inte återanvända notation och skapa förvirring (notera att min notation inte är den du har i din kod), låt oss definiera vektorn u enligt
u = [y, v]
vars komponenter vi redan har uttryck för. Naturligt är då även att säga:
u ′ = [y ′, v ′] = [ u(2), −C sin u(1) ]
där u(1) noterar u:s första komponent, osv. Begynnelsevillkoren är nu också, om jag får misshandla notationen lite:
u(0)(0) = π/4
u(1)(0) = 0
Än så länge har vi bara definierat problemet på en form med vektorn u ′. Denna form råkar vara den som Matlabs `ode45` gillar, så trots att vi knappt gjort något så är vi egentligen klara. Bara att trycka in denna funktionsvektor, intervallet och begynnelsevärden i `ode45` och plotta eller göra vad man vill.
Det att lära sig, utöver Matlabs egenheter med funktioner, är att `ode45` tar högerledet i en funktion på formen
y ′ = f(t, y)
och ger dig tillbaka numeriska lösningar för y och motsvarande t. I fallet ovan med kopplade ekvationer så gjorde man något mer avancerat genom att trycka in ett system av ekvationer på den formen som till och med berodde på varandra, men det klarar Matlab och Runge-Kutta av.
Det kan vara bra att även plotta markörer för varje evalueringspunkt. Ifall du ser att det blir ordentligt tjockt med punkter i någon del av utskriften så kan du ha fått tag i en problematisk ("styv") ODE och kan behöva titta på Matlabs andra rutiner för ODE-lösning.