考虑以下边界值问题:
y'' + e^y = 0 i.e. y(0) = y(1) = 0.
我很好奇MATLAB如何解决这个特定问题的有限差分方法。我知道如果我们有线性ODE,例如y'' + (e^x)y = 0
,具有相同的边界条件,然后程序相当简单。假设我们使用区间[0,1]的分区为20个相等的子区间,那么以下代码将起作用:
N = 19;
h = 1/N;
x = linspace(0, 1, N+1)';
A(1,1) = 1;
F(1) = 0;
for k=2:N
A(k,k-1) = -1/h^2;
A(k,k) = 2/h^2+exp(x(k));
A(k,k+1) = -1/h^2;
F(k) = 0;
end
A(N+1, N+1)=1;
F(N+1) = 0;
U = A\F';
然而,似乎我的问题与这个简单的例子非常不同,因为我们正在处理非线性方程组。在这种情况下我们应该如何制定代码?
答案 0 :(得分:2)
如果你想使用Matlab内置的微分方程求解器。您可以使用ode45, bvp4c
等。您的等式可以重写为以下方程组。让y = x1
和ydot = x2
得到
x1dot = x2
x2dot = -e^(x1)
根据您的边界条件,可以使用[bvp4c]
1
function SOQ
solinit = bvpinit(linspace(0,1,5),[0 0]);% initial guess taken as [0 0]
sol = bvp4c(@ode,@bouncond,solinit);
x = linspace(0,1);
y = deval(sol,x);
plot(x,y(1,:));
end
function dydx = ode(x,y) % system of equations
dydx = [y(2);-exp(y(1))];
end
function res = bouncond(ya,yb) % boundary conditions
res = [ya(1);yb(1)];
end
答案 1 :(得分:1)
您需要一个迭代求解器。在最简单的情况下用
反复解决 A(k,k-1) = -1/h^2;
A(k,k) = 2/h^2;
A(k,k+1) = -1/h^2;
F(k) = -exp(y(k));
对于类似牛顿的过程,将下一个近似值u
计算为与y
的差异较小,以便e^u=e^y*e^(u-y)=e^y*(1+(u-y)+..)
使得要求解的线性化方程为
u'' + e^y*u = F(x) = -e^y*(1-y)
即
A(k,k-1) = -1/h^2;
A(k,k) = 2/h^2 + exp(y(k));
A(k,k+1) = -1/h^2;
F(k) = -exp(y(k))*(1-y(k));