MATLAB ode45的三種傳參方式

2021-10-23 12:25:06 字數 3563 閱讀 7600

使用ode45函式時,需要自定義函式。而有的時候自定義函式會有一些內參,如何傳參便成為了問題。

在以下例子中,我們想要通過ode45求解以下微分方程

\frac=\frac\frac}\frac\frac\\ \\ \frac=\frac\frac}\frac-ga\frac\\ \end \right.

⎩⎪⎪⎨⎪⎪

⎧​dt

dy1​

​=y1

​+y2

​+ga

1​dt

dy2​

​−by

1​​g

a1​d

tdy2

​​dt

2d2y

2​​=

y1​+

y2​+

ga1​

dtdy

2​​b

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​+

y3​b

y1​y

3​​−

ga∗y

3​dt

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...