病态微分方程的数值解

计算科学 matlab 数字
2021-12-09 10:20:14

我想解决以下柯西问题

y=y2+t46t3+12t214t+9(1+t)2

初始条件:y(0)=2为了t[0,1.6]使用在 Matlab 中实现的 3 步 Adam-Moulton 方法,如下所示:

function [t,u] = AM3(fun,t0,T,y0,N)
  h = (T-t0)/N; % integration step
  t = t0:h:T; %time mesh
  [t(1:3),u(1:3)] = RK4(fun,t0,t0+2*h,y0,2); % first 3 steps

  for n=1:N-2
    fn = feval(fun,t(n),u(n));
    fn1 = feval(fun,t(n+1),u(n+1));
    fn2 = feval(fun,t(n+2),u(n+2));
    F = @(z) z - u(n+2) - (h/24)*(9*feval(fun,t(n+3),z) + 19*fn2 - 5*fn1 + fn);
    z0 = u(n+1);
    z1 = u(n+2);
    dF = @(z) 1 - (h/24)*9*(2*z);
    u(n+3) = newton(F,dF,z0);
  end
endfunction

N 是使用的积分节点数(即时间网格的大小)。函数返回数组中问题的离散解u. 由于该方法在每次迭代中都是隐式的,因此我使用牛顿方法写为

function y = newton(f,df,x)
 fx = f(x);
 tol = 1e-10;
 itermax = 1e3;
 iter = 0;
 while abs(fx) > tol && iter < itermax
    x = x - f(x)/df(x);
    fx = f(x);
    iter++;
 endwhile
 y=x;

我的问题是,这个方程似乎是非常病态的,因为即使有一个很小的积分步骤h我得到的是这样 在此处输入图像描述 的:问题持续存在更大N.

尽管方程非常难看,但它有精确的解:y(t)=(t1)(t2)t+1这是相对简单的。

你能帮我解决这个问题吗?我仔细检查了算法,它们看起来不错;我还尝试用其他一些方法(割线、定点等)改变牛顿的方法,但没有出现任何新奇之处。

我还尝试改变与 Adam-Bashforth 或 Runge-Kutta 一起使用的方法,但无济于事。

1个回答

您可以对 Riccati 方程进行去奇异化y=y2+a通过设置y=uu要得到u+au=0. 如果在积分区间上是连续的,则解将在该区间上表现良好。求解给出了情节au(0)=1u(0)=y(0)=2

在此处输入图像描述

在大约处具有奇点在任何数值积分中,之后的所有内容都被视为随机噪声。uyt=0.35230


在您显然打算完成的任务中,对于某些给定的解函数,即提名者中的第 4 次项来自于第 2 项,因此需要有一个负系数。使用方程中的这个校正符号,变换方程的解看起来像y=y2+pp2a=pp2p

在此处输入图像描述

所以分母离零很远。直接求解方程也证实了这一点。即使在初始值严重失真的情况下也没有发散u

在此处输入图像描述