用Matlab bvp4c 解带未知参数的常微分方程边值问题




要求解的方程选自Data-Driven Modeling Scientific Computation 一书的§7.7。

方程为:

\begin{equation*} y''+(100-\beta)y+\gamma y^3=0 \end{equation*}

边界条件:

\begin{equation*} \begin{split} y(-1)=&0\\ y(1)=&0\\ y(-1)=&0.1 \end{split} \end{equation*}

给定$\gamma=1$ 解 $\beta$ 和 $y(x)$。

程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
function nonlinear_eign ()
%*****************************************************************************80
%
% Data-Driven Modeling Scientific Computation 7.7
% Author: Li-Jian Qu http://www.joyfulphysics.net
% 2018年5月10日
% 利用 bvp4c 解如下非线性本征值问题
% y''+(100-beta)y+gamma*y^3=0
% y(-1)=0; y(1)=0; y'(-1)=0.1
<p>% 猜测未知参数 beta 初值<br />
beta=90;</p>
<p>%<br />
% 猜测初始解<br />
%<br />
x_init = linspace ( -1, 1, 20 );<br />
solinit = bvpinit( x_init, @noneign_init, beta);</p>
<p>% 应用 BVP4C 求解<br />
%<br />
sol = bvp4c ( @noneign_ode, @noneign_bc, solinit );</p>
<p>% 应用 DEVAL 给出解的数值<br />
%<br />
x = linspace(-1,1,100);<br />
y = deval ( sol, x );<br />
beta_computed = sol.parameters;<br />
fprintf ( 1, '\n' );<br />
fprintf ( 1, ' Computed eigenvalue beta = %g\n', beta_computed );<br />
%<br />
% 画图<br />
%<br />
plot ( x, y(1,:), 'r-', 'Linewidth', 2 );<br />
xlabel ( '&lt;--- X ---&gt;', 'Fontsize', 16 );<br />
ylabel ( '&lt;--- Y(X) ---&gt;', 'Fontsize', 16 );<br />
title ( 'Nonlinear Eigenfunction Problem', 'Fontsize', 16 )<br />
grid on<br />
filename = 'noneign.png';<br />
print ( '-dpng', filename );<br />
fprintf ( 1, '\n' );<br />
fprintf ( 1, ' Saving plot file as &quot;%s&quot;\n', filename );<br />
%<br />
return<br />
end</p>
<p>function dydx = noneign_ode ( x, y, beta )<br />
%% 此函数给出微分方程<br />
% 将方程写为一阶微分方程组的形式<br />
% dydx = f(x,y)<br />
gamma=1.0;<br />
dydx(1) = y(2);<br />
dydx(2) = (beta-100)<em>y(1)-gamma</em>y(1)^3;</p>
<p>return<br />
end</p>
<p>function bc = noneign_bc ( ya, yb, beta )<br />
%% 此函数给出边界条件<br />
%</p>
<p>bc(1)=ya(1);<br />
bc(2)=yb(1);<br />
bc(3)=ya(2)-0.1;</p>
<p>return<br />
end</p>
<p>function y_init = noneign_init ( x )<br />
%% 此函数给出猜测解<br />
%<br />
y_init(1) = x^2-1;%cos((pi/2)<em>x);<br />
y_init(2) = 2</em>x;% -(pi/2)<em>sin((pi/2)</em>x);</p>
<p>return<br />
end</p>

结果:

1
2
3
>> nonlinear_eign
<p>Computed eigenvalue beta = 97.5357</p>
<p>Saving plot file as &quot;noneign.png&quot;</p>

如果换不同的初值,会得到不同的结果,你不妨试试。

标签: matlab, bvp4c, 常微分方程, 边值问题

添加新评论

captcha
请输入验证码