MP006 Perspektiv på materialdesign: MATLAB MAT: Föreläsning Funktionsfiler, scriptfiler If-satser For-loopar While-slingor Funktioner i MATLAB för: lösning av linjära och ickelinjära ekvationer lösning av första ordningens ordinära differentialekvationer Bilder 008-0-4
MP006 Perspektiv på materialdesign: MATLAB MAT: Funktionsfiler och scriptfiler i MATLAB Det finns två typer av Matlabfiler (M-filer): Scriptfiler: En samling satser som lagras i en M-fil. En scriptfil eekveras som om kommandona skrivits in i kommandofönstret. Script-filer delar kommandofönstrets arbetsminne. Funktionsfiler: En speciell sorts M-fil som kan ta emot indata i samband med anropet (inargument) och returnera ett resultat (utargument) till det anropande programmet. Funktioner använder ett eget arbetsminne
MP006 Perspektiv på materialdesign: MATLAB MAT:3 Eempel med funktionsfil: function z = my_mean(,y) %MY_MEAN calculates the mean value of numbers. %More comments eplaining the function..., %end the comments with a blank line z = (+y)/; end %function my_mean Dummy arguments (z,, y) >> a=my_mean(3,7) a = 5 >> =[5 8 0]; >> p=[8-0]; >> b=my_mean(,p) Actual arguments (a, 3, 7) Funktionsfilen sparas som: my_mean.m b = 6.5000 5.0000 5.0000
MP006 Perspektiv på materialdesign: MATLAB MAT:4 The function mean eists already in MATLAB lookfor <function name> Gives a short eplanation of the fcn >> =[ 3 4 5]; >> a=mean() a = 3 Try also >>help mean >>help my_mean
MP006 Perspektiv på materialdesign: MATLAB MAT:5 Eempel med Scriptfil: Scriptfilen sparas som: medel_varde.m % Script File: medel_varde.m disp('beräkning av medelvärdet av två tal/vektorer'); = input('ange det första numeriska värdet: '); y = input('ange det andra numeriska värdet: '); medel = (+y)/; disp(['medelvärdet är : ' numstr(medel)]); >> medel_varde Beräkning av medelvärdet avtvå tal/vektorer Ange det första numeriska värdet: 3 Ange det andra numeriska värdet: 7 Medelvärdet är : 5 Använd beskrivande kommentarer i både script- och funktions-filer >> medel_varde Beräkning av medelvärdet avtvå tal/vektorer Ange det första numeriska värdet: [ 3] Ange det andra numeriska värdet: [4 5 6] Medelvärdet är :.5 3.5 4.5
MP006 Perspektiv på materialdesign: MATLAB MAT:6 All programspråk för datorer innehåller speciella satser s.k. styrande satser, som avgör i vilken ordning satserna i programmet ska utföras. Med de styrande satserna kan den linjära strukturen i programmet brytas: vissa satser hoppas över medan andra upprepas De styrande satserna kan indelas i: Villkorssatser (if, switch): vissa delar av koden utförs bara om något villkor är uppfyllt Repetitionssatser (for, while) : vissa delar av koden upprepas enligt något villkor
MP006 Perspektiv på materialdesign: MATLAB MAT:7 Villkor, logiska uttryck och jämförelseoperatorer Styrande satser innehåller villkor som avgör vilka satser som ska utföras. I MATLAB uttrycks villkoren med logiska variabler eller logiskt uttryck. En logisk variabel är en speciell typ av varaiabel som bara kan ha två värden: sant eller falskt (true eller false). Ett logiskt uttryck ger ett resultat som är sant eller falsk. Den allmänna formen för ett logiskt uttryck är: a op a Logiska uttryck kan konstrueras med aritmetiska uttryck (a, a) och jämförelseoperatorerna (op) enligt tabellen nedan. Uttrycken kan även konstrueras med logiska operatorer.
MP006 Perspektiv på materialdesign: MATLAB MAT:8 Villkorssatsen -if satsen if <logiskt uttryck > satsgrupp elseif <logiskt uttryck > satsgrupp else satsgrupp 3 end Med if-satsen kan flervalssituationer lösas. Bara satserna för ett av villkoren kommer att utföras. elseif och else kan utelämnas. %Script file: condition_.m a = input('enter a value for the variable a: '); if a<0 disp('a is negative'); elseif a>= 0 disp('a is greater than 0'); else disp('a is positive and less than 0'); end
MP006 Perspektiv på materialdesign: MATLAB MAT:9 function funk() %FUNK is a test for if-statement if ==0 disp('the number is 0'); elseif >0 disp('the number is positive'); else disp('the number is negative'); end end %function funk funktionen saknar out-argument ==0, jämförelse likhetstecken funktionsfilen funk.m % Script file: test_of_funk.m clc; num = input('enter a number: '); funk(num); scriptfilen test_of_funk.m >> test_of_funk Enter a number: - The number is negative
MP006 Perspektiv på materialdesign: MATLAB MAT:0 Repetitionssatser: for-satsen, while-satsen MATLAB har två satser för att upprepa t.e. en viss typ av beräkningar: for och while. Dessa gör det möjligt att utföra en grupp av satser en eller flera gånger for-satsen används när man upprepar ett fit, förutbestämt antal gånger. while-satsen används när man upprepar så länge ett logiskt villkor är sant. Den är lämplig att använda när man inte vet hur många gånger något ska utföras.
MP006 Perspektiv på materialdesign: MATLAB MAT: for - satsen: Allmän form för en for -sats: for inde = uttryck satsgrupp end Slutet på for-satsen markeras med ett end inde är namnet på en s.k. loopvariabel. Den sätts i tur och ordning till kolumnerna i den vektor som är resultatet av uttryck. Eempel: my_sum = 0; for ii = ::00 my_sum = my_sum + ii; end my_sum = ++3+ +00 = = 5050 Satsgruppen utförs en gång för varje värde på loopvariabeln. Satsgruppen kan i princip vara vilken MATLAB-kod som helst
MP006 Perspektiv på materialdesign: MATLAB MAT: while - satsen: I en while-sats repeteras en satsgrupp så länge ett logiskt villkor är sant. En whilesats har formen: while logiskt_uttryck satsgrupp end Logiskt_uttryck beräknas när eekveringen av while-satsen börjar. Om det logiska uttrycket är sant utförs satsgrupp. Därefter beräknas det logiska uttrycket igen och förfarandet upprepas tills det logiska uttrycket blir falskt. Eempel: my_sum = 0; ii = ; while ii <=00 my_sum = my_sum + ii; ii=ii+; end my_sum = ++3+ +00 = = 5050 (ii = 0 efter while-satsen)
MP006 Perspektiv på materialdesign: MATLAB MAT:3 Test av for-loop med funktionsfil och kommandofil (script file) function sum=for_sum(start,slut) %FOR_SUM test of for loop sum_i=0; for i=start::slut sum_i=sum_i+i; end sum = sum_i; end %function for_sum Funktionsfil för test av for-loop Här kan i användas som inde, sum som variabelnamn % Script file: test_for_sum clc s = input('ange startvärdet: '); p = input('ange slutvärdet: '); if s<=p disp(['summan blev: ' numstr(for_sum(s,p))]); else disp('felaktiga värden'); end >> test_for_sum Ange startvärdet: Ange slutvärdet: 00 Summan blev: 5050
MP006 Perspektiv på materialdesign: MATLAB MAT:4 MATLAB-funktionen sum kan beräkna samma summa! >> ii=::00; >> s=sum(ii) s = 5050 Information om funktionen sum från MATLAB help
MP006 Perspektiv på materialdesign: MATLAB MAT:5 Lösning av icke linjära ekvationer (): Polynom Ett polynom är ett matematiskt uttryck där variabler och konstanter kombineras enbart genom addition, subtraktion och multiplikation. Ett polynom kan alltid uttryckas på standardformen: P( ) = n k = 0 a k k = a n n + a Eempel, ett andragradspolynom: n n +... + a + a P( ) = + 3 6 Ett polynom i Matlab kan beskrivas med enbart koefficienterna, P( ) = + 3 6 => P( i) = [ 3-6] Polynomets nollställen kan bestämmas med funktionen roots(c): >> roots([ 3-6]) 0
MP006 Perspektiv på materialdesign: MATLAB MAT:6 Några eempel: >> roots([ 3-6]) ans = -4.373.373 >> roots([ 3 6]) ans = -.5000 +.9365i -.5000 -.9365i >> roots([ 3 4 5 6 7 8-9]) ans = -.5763 -.597 +.0366i -.597 -.0366i -0.586 +.4806i -0.586 -.4806i 0.89 +.0870i 0.89 -.0870i 0.5745
MP006 Perspektiv på materialdesign: MATLAB MAT:7 Lösning av icke linjära ekvationer (): alla typer (?) Ekvationen/funktionen definieras i en funktionsfil Funktionens nollställen kan bestämmas med fsolve eller fzero Funktionen kan plottas med fplot
MP006 Perspektiv på materialdesign: MATLAB MAT:8 function f = funk_() %FUNK_ Eample of solving equations Funktionsfil: funk_.m f = log0()-.^+; end %function funk_ %Script file: test_of_funk_.m %plottning av funktionen fplot('funk_',[0.5 ]); %hitta nollställen 0=fsolve('funk_',0.6); disp(['nollställe vid: ' numstr(0)]); %bestäm funktionsvärden =0:0.5:3; %radvektor med 7 element tabell=[' funk_()']; %tabell med 7 rader kolumner disp('funktionsvärden:'); disp(tabell); Script fil: test_of_funk_.m
MP006 Perspektiv på materialdesign: MATLAB MAT:9 Utdata från script file test_of_funk_.m 0=fsolve('funk_',0.6); Nollställe vid: 0.56844 Funktionsvärden 0 -Inf 0.5000-0.050.0000 0.5000-0.5739.0000 -.6990.5000-3.35 3.0000-5.59 Funktionen f = log0()-.^+; obs
MP006 Perspektiv på materialdesign: MATLAB MAT:0 Eempel med funktionen fzero och en handle till en funktion % Script file: test_of_funk_.m %plottning av funktionen hh=@funk_; %hh=handle till funktionen fplot(hh,[0.5 ]); %hitta nollställen 0=fzero(hh,[0.5 0.7],e-5); %0=fzero(hh,,e-5); disp(['nollställe vid: ' numstr(0)]); %bestäm funktionsvärden =0:0.5:3; %radvektor med 6 element tabell=[' hh()']; %tabell med 6 rader kolumner disp('funktionsvärden:'); disp(tabell); En handle är praktisk att använda, eftersom programmet blir mer generellt. fzero(handle,[start slut],tolerans) fzero(handle,near,tolerans) 0= 0.56844 för rad 6 0= för rad 7 (kommentar)
MP006 Perspektiv på materialdesign: MATLAB MAT: Lösning av differentialekvationer (): Allmänt n n d y d y dy a0 + a +... + a a y f ( t) n n n + n = dt dt dt Liinjär diff.ekv. Linjär diff.ekv => alla derivatorer ingår i linjära termer, inte av typ: n:te ordningen => n är högsta derivatans ordningsnummer konstanta koefficienter => a:na är konstanter, inte funktion av t f(t) kallas störfunktion,drivfunktion f(t) = 0 => homogen diff.ekv. dy dt Lösningen till differentialekvationen består av summan y h + y p y h = lösningen till den homogena diff. ekv. y p = partikulärlösningen
MP006 Perspektiv på materialdesign: MATLAB MAT: Lösning av differentialekvationer (): Allmänt, Eempel Bestäm lösningen till den homogena differentialekvationen : d y dy + 5 + 6y = 0 dt dt rt Gör ansatsen y = e och sätt in i diff.ekv. => ( r Den karakteristiska ekvationen r r e rt = - och r Den allmänna lösningen blir då : Konstanterna C y = C e + 5r + 6) = 0 t + C = -3 e 3t och C + 5r + 6 = 0 har rötterna bestäms av diff.ekv.randvillkor. Om den karakteristiska ekvationen har imaginära rötter eller dubbelrot blir lösningen på annat sätt, se blad 4.
A MP006 Perspektiv på materialdesign: MATLAB MAT:3 Lösning av differentialekvationer (3): Allmänt, eempel Bestäm en partikulärlösning till : d y dy + 5 + 6y = 6t t + 0 dt dt Polynomansats för partikulärlösningen : Sätt in partikulärlösningen i diff.ekv.: y = + 0A t + 5A Lösning, identifiering ger : A Partikulärlösningen blir : y = t t + 3 Den allmänna lösningen blir : t Konstanterna C A t y = C e + A t + A + C + 6A t e 3t och C 3 + 6A t + 6A + t =, A t + 3 3 = 6t =, t + 0 = 3 bestäms av diff.ekv.randvillkor. A 3
MP006 Perspektiv på materialdesign: MATLAB MAT:4 Lösning av differentialekvationer (4): Allmänt, eempel Bestäm lösningen till den homogena differentialekvationen : d y dy + 4 + 3y = 0 dt dt rt Gör ansatsen y = e och sätt in i diff.ekv. => Den karakteristiska ekvationen r Den allmänna lösningen blir då : där r e e ( C B rt ( r = - + 3i och r t B e ( C t = ( C ) e Konstanterna C y = C e + C + 4r + 3) = 0 ( + 3i) t (cos3t + i sin 3t) + C t + C cos3t + i( C och C = --3i cos3t + B e e t + C ) och B ( 3i) t sin 3t = e C = i( C t + 4r + 3 = 0 har rötterna ( C e (cos3t i sin 3t)) = ) e C t ) 3it + C 3it ) = bestäms av diff.ekv.randvillkor. sin 3t = e
MP006 Perspektiv på materialdesign: MATLAB MAT:5 Lösning av differentialekvationer: Matlab Matlab använder ode-solvers (ode45, ode3,.) för att lösa diff.ekv. Allmän form: [time,]=solver(fh,t,0) time: radvektor med tidsvärden : radvektor med lösning för varje tidsvärde solver: en av Matlabs ode-solver fh: definierar funktionen som ska lösas (function handle) t: tidsvärden från start till slut för lösningen 0: startvärden, randvillkor OBS Matlabs ode-solvers kan lösa diff.ekv. av :a ordningen och system av diff.ekv. av :a ordningen. En diff.ekv. av grad n kan enkelt beskrivas som ett system med n diff.ekv. av :a ordningen.
MP006 Perspektiv på materialdesign: MATLAB MAT:6 Lösning av differentialekvationer: Matlab function f=fprim_(t,y) %FPRIM first eample of ode-solving %The ode y'=t+y f=t+y; %the derivative end %function fprim_ Funktionsfil för diff.ekv. dy dt y = t %Script file: test_ode.m %ode of first order %y'=t+y, y()=, calculate y(5) hh=@fprim_; [t y]=ode45(hh,[ 5],); plot(t,y); grid on; title('plot of y(t) for y''=t+y, y()='); label('time'); ylabel('y-value'); Script-fil för test
MP006 Perspektiv på materialdesign: MATLAB MAT:7 Lösning av differentialekvationer: Matlab The solution
MP006 Perspektiv på materialdesign: MATLAB MAT:8 Lösning av differentialekvationer (5): Allmänt, eempel Enligt tidigare eempel: d y dy + 5 + 6y = 6t t + 0 dt dt Antag startvärden vid t = 0 : dy dy fall: = 0, y(0) = 0 fall : = 0, dt dt Derivering av lösningen => y = C e Insättning av värden för fall () => y = C e t y(0) = 50 3C e => y( 0 ) = C t 3t + C y (0) = C + C e + t + 3 = 0 (50) 3C 3t + t t + 3 = 0 (0) Konstanterna kan bestämmas till : C C = -7; C = 43; C = 4 för fall = 96 för fall
MP006 Perspektiv på materialdesign: MATLAB MAT:9 Lösning enligt fall: y fall: y = 7e = 43e t t + 4e 3t 96e + t 3t + t t + 3 t + 3 %Script file: plot_diff_e.m %Plot av diff.ekv. enligt fall och fall %Se föreläsning MAT t=0:0.:5; %fall subplot(,,) f=-7*ep(-*t)+4*ep(-3*t)+t.^-*t+3; plot(t,f); title('fall '); %fall subplot(,,) f=43*ep(-*t)-96*ep(-3*t)+t.^-*t+3; plot(t,f); title('fall ');
MP006 Perspektiv på materialdesign: MATLAB MAT:30 Lösning av differentialekvationer (5): Allmänt, eempel Den ursprungliga diff.ekv.av : a ordningen kan omvandlas till ett system av: a ordningens diff.ekv. d y dy + 5 + 6y = 6t dt dt Inför nya variabler och = y = y& => => & & = 6t så att : t + 0 5 Ekvationerna () och () är ett system Ekvationssystemet kan (enkelt) = t + 0 <=> && y + 5y& + 6y + 6 () () av diff.ekv.av: a ordningen! beskrivas i Matlab. = 6t t + 0 function prim= my_diff(t,) %MY_DIFF test ode prim= [();6*t.^-*t+0-5*()-6*()]; end%function rad rad
MP006 Perspektiv på materialdesign: MATLAB MAT:3 Lösning av differentialekvationer: Matlab function prim= my_diff(t,) %MY_DIFF test ode prim= [();6*t.^-*t+0-5*()-6*()]; end%function %Script file: test_my_diff.m figure(); grid on; [time ]=ode45(@my_diff,[0 5],[0 0]); subplot(,,); plot(time,(:,)); title('fall '); [time ]=ode45(@my_diff,[0 5],[50 0]); subplot(,,); plot(time,(:,)); title('fall '); startvillkor[ ]
MP006 Perspektiv på materialdesign: MATLAB MAT:3 Laboration Del : Ekvationslösning med matriser, se tips på nästa sidor Del : Dämpade oscillatorn, differentialekvation Lös ekvationen för hand (två varianter) och plotta resultatet Gör (frivillig uppgift) samma lösning med system av :a ordningens diff.ekv. Laboration 3 Programmering med villkors- och repetitions-satser
MP006 Perspektiv på materialdesign: MATLAB MAT:33 Repetition(?) Ekvationssystem, matriser Y X A = <=> = = + + + = + + + = + + + = + + + * 8 5 * 5 64 8 5 5 5 7 9 3 matrisform blir ekvationssystemet: På 5 64 8 8 5 5 5 5 7 9 3 4 3 4 3 4 3 4 3 4 3
MP006 Perspektiv på materialdesign: MATLAB MAT:34 % Script file: eq_syst_.m % eq.system, matri description: A* = y A= [ ; 3 9 7; 5 5 5; 8 64 5] y=[ - 5 8 ]'; = A\y; disp(['()= ',numstr(())]); disp(['()= ',numstr(())]); disp(['(3)= ',numstr((3))]); disp(['(4)= ',numstr((4))]); m=inv(a)*y; disp(['m()= ',numstr(m())]); disp(['m()= ',numstr(m())]); disp(['m(3)= ',numstr(m(3))]); disp(['m(4)= ',numstr(m(4))]); ()= -8 ()= 7.0333 (3)= -. (4)= 0.066667 m()= -8 m()= 7.0333 m(3)= -. m(4)= 0.066667
MP006 Perspektiv på materialdesign: MATLAB MAT:35 % Script file: eq_syst_.m % Solutions for overdetermined eq systems % The Equations: % () + () + (3) = - % () + 3*() + 9*(3) = 5 % () + 5*() + 5*(3) = 8 % () + 8*() + 64*(3) = % eq.system, matri description: A* = y A= [ ; 3 9 ; 5 5 ; 8 64 ] y=[ - 5 8 ]'; = A\y; disp(['()= ',numstr(())]); disp(['()= ',numstr(())]); disp(['(3)= ',numstr((3))]); ()= -5.3984 ()= 3.8685 (3)= -0.385 % m=inv(a)*y; Error Matri must be square