用于y'的有限差分方法的MATLAB程序。 + e ^ y = 0

时间:2017-01-12 22:13:21

标签: matlab solver differential-equations

考虑以下边界值问题:

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';

然而,似乎我的问题与这个简单的例子非常不同,因为我们正在处理非线性方程组。在这种情况下我们应该如何制定代码?

2 个答案:

答案 0 :(得分:2)

如果你想使用Matlab内置的微分方程求解器。您可以使用ode45, bvp4c等。您的等式可以重写为以下方程组。让y = x1ydot = 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));
相关问题