Enzymkatalys
Jag har följande enzymreaktion:
Utifrån den har jag tagit fram fyra DE:er för varje okänd variabel:
...där k har värden:
Jag har dessa begynnelsevillkor:
Då varken [ES] eller [P] bildats vid t = 0 antar jag att de bör vara = 0 (korrekt?)
Samtidigt får jag att genom Steady-state-approximation och Michaelis-Menten:
____
MIN UPPGIFT:
Simulera reaktionskinetiken i MATLAB genom att lösa de kopplade differentialekvationerna.
MITT PROBLEM:
Jag förstår inte hur jag ska lösa DE:erna med hjälp av den givna informationen. Att lösa dem på papper blir för rörigt och det programskal jag jobbat med tidigare i MATLAB gällde då bara för en DE samt innefattade många variabler som inte hör hemma här. Mina läroböcker ger endast allmän information om enzymer, inte hur jag ska räkna med dem.
Hur bär jag mig åt?
Känner du till vad det är för reaktortyp? Tankreaktor, tubreaktor eller batch?
Nej. Det ska representera reaktionen då enzymet Chymotrypsin bryter en peptidbindning i ett substrat vi studerat tidigare, men annars vet jag inte mer än det jag redovisat ovan.
Ah, antar att jag är lite arbetsskadad och tänkte processindustri och bioreaktorer istället :)
Jag brukar skapa en scriptfil där jag definierar begynnelsevillkoren för koncentrationerna. Sedan skapar jag en vektor med begynnelsevillkoren som element. Beroende på hur komplexa ekvationerna är brukar jag i första hand använda ode45-solvern och annars ode15s-solvern för att lösa ekvationerna. Output är en vektor som håller tid och koncentration medan argumentet är en vektor från 0 till den tid du vill kolla på. Anger tidigare definierad vektor som startvärde.
Sedan skapar jag en funktionsfil med tid och koncentration som variabler. Sedan måste man återigen definiera vilket element i den ingående koncentrationvektorn som hör ihop med vilket ämne, t.ex. CA=C(1); ifall koncentrationen av A är det första elementet i koncentrationsvektorn C. Här definierar jag även hastighetskonstanterna och deras värden. Sen definierar jag diffekvationerna på samma sätt som du har gjort i ditt inlägg, t.ex. dPdt=k2*CES;
Till sist definierar jag en ny vektor som innehåller de olika diffekvationerna. Viktigt här är att döpa den vektorn till samma namn som funktionen eftersom det ska vara dess output. Kom också ihåg att kalla på denna funktion i solvern innan du gör beräkningarna i scriptfilen.
Jag vet inte ifall det där alls gick att följa, men annars kanske du kan visa hur dina filer ser ut så kan jag se vad som borde fixas till.
Det var rätt svårt att följa, ja. Såhär ser mitt givna programskal ut:
Ja, men det där liknar ju min metod. Har du något exempel på en kod från en konkret uppgift som du har löst? Jag är långt ifrån något proffs på Matlab, men det blir nog enklare att peka på exakt vad du ska ändra för att kunna lägga in flera diffekvationer i en befintlig fil.
Det här är den simplaste jag hittade där jag använt ode45 som du ser. Var bara en enkel DE här.
Precis, den är enkel men det är i princip samma sak du ska göra nu. Eftersom du har så många derivator och ekvationer är det dock enklast att samla dessa i en funktionsfil och sedan ha en separat scriptfil där du lägger in ode-solvern och kallar på funktionsfilen.
Börja med att skapa en scriptfil och definiera begynnelsekoncentrationerna med värden. Definiera sedan en vektor med dessa koncentrationer som element. Tänk på att sätta begynnelsevärden för alla ämnen, även de två som är 0.
Börja där och visa hur du har gjort.
Bra. Nu ska du ta in ode45-solvern. Du ska skriva på följande sätt:
[namn på tidvektor, namn på koncentrationsvektor]=ode45(’namn på din funktionsfil’,[0 sluttiden],b);
Det som händer då är att Matlab kommer ta alla startkoncentrationer som ligger i din vektor b och starttiden samt sätta in dem i funktionen i din funktionsfil. Där kommer den att beräkna derivatorna för dessa koncentrationer m.h.a. ekvationerna i ditt första inlägg. Sedan kommer funktionsfilen att spotta tillbaka dem till scriptfilen. Då kommer ode45-solvern att ta en steglängd (som du kan definiera om du vill, men det behövs inte) och beräkna nästa koncentration utifrån derivatorna, startkoncentrationerna och steglängden med Newtons metod. Då får du nya koncentrationer och ett nytt t. Dessa skickas tillbaka till funktionsfilen som beräknar nya derivator, vilka skickas tillbaka o.s.v. fram till sluttiden. Varje tidpunkt och koncentration lagras i matrisen i vänsterledet och dessa kan du sedan plotta när beräkningen är klar.
När du har lagt in solvern i scriptfilen ska du skapa funktionsfilen. Den ska som sagt ha din tidvektor och koncentrationsvektor som argument.
Gör allt det som står ovan och visa hur du har gjort.
Edit: Har upptäckt ett fel. Du ska inte ha några semikolon mellan hakparenteserna när du definierar b. Egentligen skapar man en matris med en rad och ett antal kolonner, men det kallas ibland för radvektor.
Ett av mina problem var ju dock att samla alla funktioner i samma fil så att de bara kan "stoppas in" där. Om jag ska utgå ifrån det simpla exemplet jag visade så blir det ju fyra olika?
Fyra olika vad? Försök att följa mina punkter ovan så kanske det klarnar. Börja med att lägga in solvern.
En funktionsfil för fyra olika DE:er, är vad jag inte förstår hur jag ska göra.
Hoppas jag fattat rätt ang. det andra:
Ta bort det på rad 11 och använd en annan beteckning på koncentrationsvektorn i vänsterledet på rad 13.
Jag tror att du måste skriva 'jasmins_funktion'
Nu ska du skapa en funktionsfil där du kallar filen för jasmins_funktion med variablerna t och K. Välj också något namn på själva funktionen.
Inte riktigt. Där det står inputarg1, inputarg2 ska du skriva t, K och dör det står [ t , K ] ska du skriva vad funktionen ska heta.
y=f(t,x) skulle t.ex. betyda att y är en funktion av t och x. Här har vi en funktion av vår tid och koncentration.
t, K förstår jag.
Men då man öppnar New Function visas följande:
Ska det verkligen stå funktionens namn vid 'outputArg'?
Ja. Vi kommer att ha en vektor som output och denna kommer vi att döpa till samma namn som du sätter på funktionen.
untitled6 är namnet på funktionsfilen. Observera att du har skrivit function och funktion nu.
Plocka bort allt på rad 2-5. Sedan definierar du alla hastighetskonstanter samt importerar koncentrationerna från koncentrationsvektorn.
Som det ser ut just nu tar ode45 dina startkoncentrationer i vektor b och sätter in dem i K. Dessa skickas sedan över till funktionsfilen. För att få in koncentrationen av E måste du skriva E=K(1); och på motsvarande sätt för övriga ämnens koncentrationer (här har jag bara kallat koncentrationen av E för just E). Jag säger åt matlab att det är det första elementet i K-vektorn.
När du har tagit in koncentrationerna i funktionsfilen så skriver du upp diffekvationerna. T.ex. kan du skriva
dEdt= -k11*S*E+k12*ES+k2*ES;
Eller liknande beroende på vad du har valt att kalla alla variabler. Gör på detta sätt för alla diffekvationer. Till sist samlar du dem i en vektor som du döper till samma namn som din funktion:
y=[dEdt;dSdt;dESdt;dPdt];
Spara funktionen och kör scriptfilen. Se dock till att du har rätt namn på funktionsfilen i ode-solvern. Nu har du kallat den för både jasmins_funktion och jasmins_function.
Allt fungerade galant! Plottade den också, men fick öka tidsspannet för att kunna se ordentligt. Tack så mycket för hjälpen :)
Tufft. Om man vill kan man skriva om hastighetskonstanterna så att de är givna som 1/min istället för 1/sekund. Då får man en trevligare skala på x-axeln.
Jag hade behövt hjälp med att lösa Michaelis-Menten-approximationen också, samt plotta koncentrationen [P] mot tiden.
Samma begynnelsevillkor som i tidigare fall gäller.
Enligt instruktioner bör det räcka med de två ovanstående DE:erna, men då [E]t är okänd får jag bara felkoder då.
Jag har svarat i din andra tråd. Tänk på att bara skapa en tråd per uppgift.