使用ode45函式時,需要自定義函式。而有的時候自定義函式會有一些內參,如何傳參便成為了問題。
在以下例子中,我們想要通過ode45求解以下微分方程
\frac=\frac\frac}\frac\frac\\ \\ \frac=\frac\frac}\frac-ga\frac\\ \end \right.
⎩⎪⎪⎨⎪⎪
⎧dt
dy1
=y1
+y2
+ga
1dt
dy2
−by
1g
a1d
tdy2
dt
2d2y
2=
y1+
y2+
ga1
dtdy
2b
y1
dtdy
2−
gadt
dy2
而使用ode45求解則需要把上式轉換為一階微分方程組,因而我們作以下換元
令 ga
∗y3=
dy2d
t令ga*y_3=\frac
令ga∗y3
=dt
dy2
因而上述微分方程組可化為
\frac=\frac\frac}\frac\frac\\ \\ \frac=\frac-ga*y_3\\ \\ \frac=ga*y_3\\ \end \right.
⎩⎪⎪⎪⎪⎪
⎨⎪⎪⎪
⎪⎪⎧
dtdy
1=
y1+
y3+
ga1
dtdy
2−
by1
ga1
dtd
y2
dtdy
3=
y1+
y2+
y3b
y1y
3−
ga∗y
3dt
dy2
=ga
∗y3
可以看到上述微分方程組中有兩個常數b和ga,因而我們想求解不同的b和ga下的y值,但是傳統的ode45中規定我們方程傳入引數只能有t和y,那我們便可以採用以下三種方式把常量作為引數傳入其中
首先便是可以直接利用ode45給的傳參輸入變數來輸入傳參
即ode45(函式控制代碼,起止時間(兩個數)/指定時間(向量),初始值,flag(置空即可),傳參)
c=
jet(5)
;b=0.1;
hold off
for i =1:
5 ga=
0.01
*i;[t,y]
=ode45
(@df1,[0
300],[
100010
],,b,ga)
;plot
(t,y(:
,2),
'color',c
(i,:
)...
,'displayname',[
'ga='
,num2str
(0.1
*i)]
...,
'linewidth',2
) hold on
endlegend show
function dy=
df1(t,y,b,ga)
dy=zeros(3
,1);
dy(1)
=-b*y(
1)*y
(2)/
sum(y);dy
(2)=b*y(
1)*y
(2)/
sum(y)
-ga*y(
2);dy
(3)=ga*y(
2);end
其次便是可以利用函式控制代碼進行傳參
這種傳參方式可以擴充套件到其他需要輸入自定義函式的matlab函式(比如fmincon,其規定自定義函式傳入引數只能有y),而且比起方法三來說,這種方法不會因為使用全域性變數而產生一些難以發現的錯誤
c=
jet(5)
;b=0.1;
hold off
for i =1:
5 ga=
0.01
*i;[t,y]
=ode45
(@(t,y)
df1(t,y,b,ga),[
0300],
[100010
]);plot
(t,y(:
,2),
'color',c
(i,:
)...
,'displayname',[
'ga='
,num2str
(0.1
*i)]
...,
'linewidth',2
) hold on
endlegend show
function dy=
df1(t,y,b,ga)
dy=zeros(3
,1);
dy(1)
=-b*y(
1)*y
(2)/
sum(y);dy
(2)=b*y(
1)*y
(2)/
sum(y)
-ga*y(
2);dy
(3)=ga*y(
2);end
最後便是可以利用全域性變數進行傳參
注意:本方法不能在實時指令碼中使用
c=
jet(5)
;global b ga
b=0.1
;hold off
for i =1:
5 ga=
0.01
*i;[t,y]
=ode45
(@df2,[0
300],[
100010
]);plot
(t,y(:
,2),
'color',c
(i,:
)...
,'displayname',[
'ga='
,num2str
(0.1
*i)]
...,
'linewidth',2
) hold on
endlegend show
function dy=
df2(t,y)
dy=zeros(3
,1);
dy(1)
=-b*y(
1)*y
(2)/
sum(y);dy
(2)=b*y(
1)*y
(2)/
sum(y)
-ga*y(
2);dy
(3)=ga*y(
2);end
IOS三種傳值方式
1 建立乙個協議 protocol 2 在a中宣告協議 property nonatomic,assign id bdelegate 3 在a中呼叫協議 ibaction gobackbtn uibutton sender self dismissviewcontrolleranimated yes...
vue三種傳參方式
子元件通過 route.name接收引數 子元件接收 第二種 通過router link中的to屬性 對應路由配置 通過路由中的name屬性來確定匹配的路由,通過params來傳遞引數 params是乙個物件,裡面是key value的形式 gohome 子元件接收 this.route.param...
vue 三種傳值方法
話不多說,直接撰寫 第一種 父傳子 父 父元件 v model雙向繫結 child div template import child from child export default data script 子元件 子元件 span div template export default scr...