Skillnad mellan versioner av "MATLAB-övningar"

Från KFKA10
Hoppa till: navigering, sök
(Allmän programmering)
(Krånglig ODE)
 
(16 mellanliggande versioner av samma användare visas inte)
Rad 1: Rad 1:
För den som föredrar att först bli van vid MATLAB innan du ger dig i kast med värmepumpsuppgiften finns här några rena MATLAB-uppgifter att träna på. Första delen syftar till att ge steg-för-steg introduktion till ''programmering'' i MATLAB (d.v.s. inte den "miniräknar"-aktiga användningen i MATLAB som ni redan är förtrogna med sedan introduktionskursen i MATLAB). Andra delen handlar om de specifika funktioner , och här ges inte fullständig beskrivning utan det förutsätts att man också läst labbhandledningen till datorlabben.
+
För den som föredrar att först bli van vid MATLAB innan du ger dig i kast med värmepumpsuppgiften finns här några rena MATLAB-uppgifter att träna på. Första delen syftar till att ge steg-för-steg introduktion till ''programmering'' i MATLAB (d.v.s. inte den "miniräknar"-aktiga användningen i MATLAB som ni redan är förtrogna med sedan introduktionskursen i MATLAB). Andra delen handlar om de specifika numeriska funktioner som behövs i datorlabben. En noggrannare beskrivning av funktionerna finns i labbhandledningen till datorlabben samt i kompendiet ''Börja med MATLAB'',
  
I båda delarna ges lösningsförslag som gömda avsnitt. Det är inte meningen att du ska använda detta utom som sista utväg om du kört fast.
+
I båda delarna ges lösningsförslag som gömda avsnitt. Det är bara meningen att du ska använda detta som sista utväg om du kört fast.
  
  
== Allmän programmering ==
+
= Allmän programmering =
  
Innan du börjar, se till
+
Innan du börjar, se till att du har en underkatalog till din hemkatalog där du lägger alla Matlab-script. Under denna kan du sedan lägga ytterligare underkataloger för enskilda övningar, som t.ex. den här.
  
Enkelt program
+
Skapa ett script, skriv in koden, spara scriptet och kör det sedan med Run-knappen.
  
Skriv ett program som beräknar volymen för en ideal gas, med trycket 5.2 bar, substansmängden 2.4 mol och temperaturen 15 grader. Värdena ska läggas i variabler så att själva uträkningen inte innehåller några siffror.
+
==Enkelt program==
  
Svar:
+
'''Uppgift:''' Skriv ett program som beräknar volymen för en ideal gas, med trycket 5.2 bar, substansmängden 2.4 mol och temperaturen 15 grader. Värdena ska läggas i variabler så att själva uträkningen inte innehåller några siffror.
  
 
+
'''Svar''': 11.1 liter
Lösning
 
  
 
<div class="toccolours mw-collapsible mw-collapsed" data-expandtext="Visa lösningsförslag" data-collapsetext="Dölj" style="width:60em;">
 
<div class="toccolours mw-collapsible mw-collapsed" data-expandtext="Visa lösningsförslag" data-collapsetext="Dölj" style="width:60em;">
<code>
+
<syntaxhighlight lang="MATLAB">
 
R=8.3145;
 
R=8.3145;
 
p=5.2e5;
 
p=5.2e5;
 
T=15+273.15;
 
T=15+273.15;
 
n=2.4;
 
n=2.4;
V=n.*R.*T./p      %Notera att vi redan nu anger att det är elementvis multiplikation, ifall vi i framtiden vill använda uttrycket för vektorer.
+
V=n.*R.*T./p       
</code>
+
%Notera att vi redan nu anger att det är elementvis multiplikation,  
 +
ifall vi i framtiden vill använda uttrycket för vektorer.
 +
</syntaxhighlight>
 
</div>
 
</div>
  
<syntaxhighlight lang="C++">
+
==Definiera funktion==
def foo(x):
+
 
    if x == 0:
+
'''Uppgift:''' Skapa med hjälp av kommandot <code>function</code> en funktion <code>vol(n,T,p)</code> som returnerar volymen för en ideal gas. Använd funktionen för att lösa samma problem som i förra uppgiften.
        bar()
+
 
        baz()
+
Observera att <code>function</code> kan användas antingen lokalt i scriptet, eller i en egen m-fil med namn enligt funktionen (<code>vol.m</code>) Testa gärna båda sätten.
    else:
+
 
        qux(x)
+
<div class="toccolours mw-collapsible mw-collapsed" data-expandtext="Visa lösningsförslag" data-collapsetext="Dölj" style="width:60em;">
        foo(x - 1)
+
<syntaxhighlight lang="MATLAB">
 +
volume=vol(2.4, 15+273.15, 5.2e5)
 +
 
 +
function V=vol(n,T,p)
 +
R=8.3145;
 +
V=n.*R.*T./p    ; 
 +
end
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
</div>
  
== Specifikt om numerisk integrering och numerisk lösning av differentialekvationer ==
+
==Anonym funktion==
  
 +
'''Uppgift:''' Gör samma sak med en så kallad anonym funktion, som beskrivs i datorlabbhandledningen. Låt funktionen ligga i en variabel <code>vola</code> så att du kan använda den på samma sätt som din föregående funktion.
  
 +
<div class="toccolours mw-collapsible mw-collapsed" data-expandtext="Visa lösningsförslag" data-collapsetext="Dölj" style="width:60em;">
 +
<syntaxhighlight lang="MATLAB">
 +
R=8.3145;
 +
vola = @(n, T, p) n.*R.*T./p; 
  
 +
volume=vola(2.4, 15+273.15, 5.2e5)
 +
</syntaxhighlight>
 +
</div>
  
 +
==Vektor==
  
+
'''Uppgift:''' Beräkna volymen för 1 mol gas vid temperaturen 298 K och följande tryck: (0.5, 1.1, 2.0, 3.5, 6.0) bar. Använd ett enda anrop till din funktion <code>vola</code> genom att lägga trycken i en vektor. Plotta volymen som funktion av trycket. Beräkna också volymsändringen mellan den andra och tredje punkten genom att ta ut värden ur resultatvektorn. Slutligen, beräkna produkten p*V för alla punkter genom att multiplicera vektorerna, och kontrollera att produkten är konstant.
  
 +
'''Svar:'''(49.6, 22.5, 12.4, 7.1, 4.1) liter. <math>\Delta V= 10.1</math> liter. <math>p\cdot V=2.48</math> kJ för alla punkter.
  
1. Definiera funktionen $z(p,s)=\frac{1}{\sqrt{p}+s}$. Beräkna integralen
 
\begin{displaymath}
 
\int_{p_1}^1 z(p_1,s)ds \;\;\;\; \textrm{där} \;\;\;\; p_1=\int_0^1 z(p,5)dp 
 
\end{displaymath}
 
  
{\bf Svar:} 0.8664  ($p_1=0.1768$)
+
<div class="toccolours mw-collapsible mw-collapsed" data-expandtext="Visa lösningsförslag" data-collapsetext="Dölj" style="width:60em;">
\\
+
<syntaxhighlight lang="MATLAB">
 +
R=8.3145;
 +
vola = @(n, T, p) n.*R.*T./p; 
  
2. Beräkna $p(2)$ om $p(1)=1/3$ och $\frac{dp}{ds}=\exp(z(p,s))$ där $z(p,s)$ är samma funktion som i föregående uppgift. (Tips: tänk på vad som motsvarar $x$ och $y$ här.)
+
pvec=[0.5, 1.1, 2.0, 3.5, 6.0]*1e5;  %SI-enheter
 +
Vvec=vola(1, 298, pvec)      %Svaret också i SI-enheter
 +
plot(pvec/1e5,Vvec*1000,'ro');    %I grafen kan vi använda andra enheter'
 +
xlabel('Tryck (bar)');
 +
ylabel('Volym (liter)');
 +
deltaV = Vvec(3)-Vvec(2)
 +
pV = pvec.*Vvec
 +
</syntaxhighlight>
 +
</div>
 +
 
 +
==For-loop==
 +
 
 +
'''Uppgift:''' Gör exakt samma volymsberäkningar som i ovanstående uppgift men med hjälp av ett anrop till funktionen <code>vola</code> ''för varje tryck'' istället. Använd en <code>for</code>-loop och lägg resultaten i en vektor liksom i ovanstående uppgift.
 +
 
 +
<div class="toccolours mw-collapsible mw-collapsed" data-expandtext="Visa lösningsförslag" data-collapsetext="Dölj" style="width:60em;">
 +
<syntaxhighlight lang="MATLAB">
 +
R=8.3145;
 +
vola = @(n, T, p) n.*R.*T./p
 +
 
 +
pvec=[0.5, 1.1, 2.0, 3.5, 6.0]*1e5; 
 +
for i=1:5
 +
  Vvec(i)=vola(1, 298, pvec(i) );
 +
end
 +
%plot etc. (samma som ovan)
 +
</syntaxhighlight>
 +
</div>
  
{\bf Svar:} 1.848
+
= Specifikt om numeriska funktioner =
 +
 
 +
==Enkel integral==
 +
Beräkna arean av en halvcirkel med radien 1 med hjälp av följande integral:
 +
:<math>\int_{-1}^1 \sqrt{1-x^2}\,dx</math>
 +
 
 +
'''Svar:''' 1.5708    (<math>=\pi/2</math>)
 +
 
 +
<div class="toccolours mw-collapsible mw-collapsed" data-expandtext="Visa lösningsförslag" data-collapsetext="Dölj" style="width:60em;">
 +
<syntaxhighlight lang="MATLAB">
 +
integral(@(x) sqrt(1-x.^2), -1, 1)
 +
</syntaxhighlight>
 +
</div>
 +
 
 +
==Krånglig integral==
 +
'''Uppgift''': Definiera funktionen <math>z(p,s)=\frac{1}{\sqrt{p}+s}</math>. Beräkna integralen:
 +
:<math>\int_{p_1}^1 z(p_1,s)ds \;\;\;\;</math> där <math>\;\;\;\; p_1=\int_0^1 z(p,5)dp </math>
 +
 
 +
'''Svar:''' 0.8664  (<math>p_1=0.1768</math>)
 +
 
 +
<div class="toccolours mw-collapsible mw-collapsed" data-expandtext="Visa lösningsförslag" data-collapsetext="Dölj" style="width:60em;">
 +
<syntaxhighlight lang="MATLAB">
 +
p1=integral(@(p) z(p, 5), 0, 1)    %Observera att funktionen som ska integreras bara kan
 +
                                  %ha en parameter, nämligen integrationsvariabeln p
 +
ans=integral(@(s) z(p1,s), p1, 1)  %Här integrerar vi ju över s istället
 +
 
 +
function zz=z(p,s)
 +
  zz=1.0./(sqrt(p)+s);
 +
end
 +
</syntaxhighlight>
 +
</div>
 +
 
 +
 
 +
 
 +
 
 +
==Ordinär differentialekvation (ODE)==
 +
 
 +
'''Uppgift:''' Beräkna <math>y(1)</math> om <math>y(0)=1</math> och <math>\frac{dy}{dx}=x-y</math>.
 +
 
 +
'''Svar:''' 0.736
 +
 
 +
<div class="toccolours mw-collapsible mw-collapsed" data-expandtext="Visa lösningsförslag" data-collapsetext="Dölj" style="width:60em;">
 +
<syntaxhighlight lang="MATLAB">
 +
dydx=@(x,y) x-y;
 +
[xvec,yvec]=ode45(dydx, [0 1], 1);
 +
ans=yvec(end)      % Ta ut sista värdet ur vektorn, motsvarande y(1)
 +
</syntaxhighlight>
 +
</div>
 +
 
 +
==Krånglig ODE==
 +
 
 +
 
 +
'''Uppgift:''' Beräkna <math>p(2)</math> om <math>p(1)=1/3</math> och <math>\frac{dp}{ds}=\exp(z(p,s))</math> där <math>z(p,s)</math> är samma funktion som i den "krångliga" integral-uppgiften.  (Tips: tänk på vad som motsvarar <math>x</math> och <math>y</math> här).
 +
 
 +
'''Svar:''' 1.848
 +
 
 +
<div class="toccolours mw-collapsible mw-collapsed" data-expandtext="Visa lösningsförslag" data-collapsetext="Dölj" style="width:60em;">
 +
<syntaxhighlight lang="MATLAB">
 +
dpds=@(s,p) exp(z(p, s));  %Observera ordningen på parametrarna. Den första
 +
                            %ska vara "x"-variabeln, vilket är s i vårt fall.
 +
[svec,pvec]=ode45(dpds, [1 2], 1/3);
 +
ans=pvec(end)      % Ta ut sista värdet ur vektorn, motsvarande p(2)
 +
 
 +
function zz=z(p,s)
 +
  zz=1.0./(sqrt(p)+s);
 +
end
 +
</syntaxhighlight>
 +
</div>

Nuvarande version från 7 november 2018 kl. 19.47

För den som föredrar att först bli van vid MATLAB innan du ger dig i kast med värmepumpsuppgiften finns här några rena MATLAB-uppgifter att träna på. Första delen syftar till att ge steg-för-steg introduktion till programmering i MATLAB (d.v.s. inte den "miniräknar"-aktiga användningen i MATLAB som ni redan är förtrogna med sedan introduktionskursen i MATLAB). Andra delen handlar om de specifika numeriska funktioner som behövs i datorlabben. En noggrannare beskrivning av funktionerna finns i labbhandledningen till datorlabben samt i kompendiet Börja med MATLAB,

I båda delarna ges lösningsförslag som gömda avsnitt. Det är bara meningen att du ska använda detta som sista utväg om du kört fast.


Allmän programmering

Innan du börjar, se till att du har en underkatalog till din hemkatalog där du lägger alla Matlab-script. Under denna kan du sedan lägga ytterligare underkataloger för enskilda övningar, som t.ex. den här.

Skapa ett script, skriv in koden, spara scriptet och kör det sedan med Run-knappen.

Enkelt program

Uppgift: Skriv ett program som beräknar volymen för en ideal gas, med trycket 5.2 bar, substansmängden 2.4 mol och temperaturen 15 grader. Värdena ska läggas i variabler så att själva uträkningen inte innehåller några siffror.

Svar: 11.1 liter

R=8.3145;
p=5.2e5;
T=15+273.15;
n=2.4;
V=n.*R.*T./p      
%Notera att vi redan nu anger att det är elementvis multiplikation, 
ifall vi i framtiden vill använda uttrycket för vektorer.

Definiera funktion

Uppgift: Skapa med hjälp av kommandot function en funktion vol(n,T,p) som returnerar volymen för en ideal gas. Använd funktionen för att lösa samma problem som i förra uppgiften.

Observera att function kan användas antingen lokalt i scriptet, eller i en egen m-fil med namn enligt funktionen (vol.m) Testa gärna båda sätten.

volume=vol(2.4, 15+273.15, 5.2e5)

function V=vol(n,T,p)
R=8.3145;
V=n.*R.*T./p    ;  
end

Anonym funktion

Uppgift: Gör samma sak med en så kallad anonym funktion, som beskrivs i datorlabbhandledningen. Låt funktionen ligga i en variabel vola så att du kan använda den på samma sätt som din föregående funktion.

R=8.3145;
vola = @(n, T, p) n.*R.*T./p;  

volume=vola(2.4, 15+273.15, 5.2e5)

Vektor

Uppgift: Beräkna volymen för 1 mol gas vid temperaturen 298 K och följande tryck: (0.5, 1.1, 2.0, 3.5, 6.0) bar. Använd ett enda anrop till din funktion vola genom att lägga trycken i en vektor. Plotta volymen som funktion av trycket. Beräkna också volymsändringen mellan den andra och tredje punkten genom att ta ut värden ur resultatvektorn. Slutligen, beräkna produkten p*V för alla punkter genom att multiplicera vektorerna, och kontrollera att produkten är konstant.

Svar:(49.6, 22.5, 12.4, 7.1, 4.1) liter. Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \Delta V= 10.1} liter. Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle p\cdot V=2.48} kJ för alla punkter.


R=8.3145;
vola = @(n, T, p) n.*R.*T./p;  

pvec=[0.5, 1.1, 2.0, 3.5, 6.0]*1e5;   %SI-enheter
Vvec=vola(1, 298, pvec)       %Svaret också i SI-enheter
plot(pvec/1e5,Vvec*1000,'ro');    %I grafen kan vi använda andra enheter'
xlabel('Tryck (bar)');
ylabel('Volym (liter)');
deltaV = Vvec(3)-Vvec(2)
pV = pvec.*Vvec

For-loop

Uppgift: Gör exakt samma volymsberäkningar som i ovanstående uppgift men med hjälp av ett anrop till funktionen vola för varje tryck istället. Använd en for-loop och lägg resultaten i en vektor liksom i ovanstående uppgift.

R=8.3145;
vola = @(n, T, p) n.*R.*T./p;  

pvec=[0.5, 1.1, 2.0, 3.5, 6.0]*1e5;  
for i=1:5
   Vvec(i)=vola(1, 298, pvec(i) );
end
%plot etc. (samma som ovan)

Specifikt om numeriska funktioner

Enkel integral

Beräkna arean av en halvcirkel med radien 1 med hjälp av följande integral:

Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \int_{-1}^1 \sqrt{1-x^2}\,dx}

Svar: 1.5708 (Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle =\pi/2} )

integral(@(x) sqrt(1-x.^2), -1, 1)

Krånglig integral

Uppgift: Definiera funktionen Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle z(p,s)=\frac{1}{\sqrt{p}+s}} . Beräkna integralen:

Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \int_{p_1}^1 z(p_1,s)ds \;\;\;\;} där Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \;\;\;\; p_1=\int_0^1 z(p,5)dp }

Svar: 0.8664 (Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle p_1=0.1768} )

p1=integral(@(p) z(p, 5), 0, 1)    %Observera att funktionen som ska integreras bara kan 
                                   %ha en parameter, nämligen integrationsvariabeln p
ans=integral(@(s) z(p1,s), p1, 1)  %Här integrerar vi ju över s istället

function zz=z(p,s)
   zz=1.0./(sqrt(p)+s);
end



Ordinär differentialekvation (ODE)

Uppgift: Beräkna Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle y(1)} om Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle y(0)=1} och Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \frac{dy}{dx}=x-y} .

Svar: 0.736

dydx=@(x,y) x-y;
[xvec,yvec]=ode45(dydx, [0 1], 1);
ans=yvec(end)       % Ta ut sista värdet ur vektorn, motsvarande y(1)

Krånglig ODE

Uppgift: Beräkna Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle p(2)} om Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle p(1)=1/3} och Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \frac{dp}{ds}=\exp(z(p,s))} där Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle z(p,s)} är samma funktion som i den "krångliga" integral-uppgiften. (Tips: tänk på vad som motsvarar Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle x} och Misslyckades med att tolka (MathML med SVG- eller PNG-återgång (rekommenderas för moderna webbläsare och tillgänglighetsverktyg): Ogiltigt svar ("Math extension cannot connect to Restbase.") från server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle y} här).

Svar: 1.848

dpds=@(s,p) exp(z(p, s));   %Observera ordningen på parametrarna. Den första 
                            %ska vara "x"-variabeln, vilket är s i vårt fall.
[svec,pvec]=ode45(dpds, [1 2], 1/3);
ans=pvec(end)       % Ta ut sista värdet ur vektorn, motsvarande p(2)

function zz=z(p,s)
   zz=1.0./(sqrt(p)+s);
end