我想解决以下柯西问题
初始条件:为了使用在 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 是使用的积分节点数(即时间网格的大小)。函数返回数组中问题的离散解. 由于该方法在每次迭代中都是隐式的,因此我使用牛顿方法写为
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;
我的问题是,这个方程似乎是非常病态的,因为即使有一个很小的积分步骤我得到的是这样
的:问题持续存在更大.
尽管方程非常难看,但它有精确的解:这是相对简单的。
你能帮我解决这个问题吗?我仔细检查了算法,它们看起来不错;我还尝试用其他一些方法(割线、定点等)改变牛顿的方法,但没有出现任何新奇之处。
我还尝试改变与 Adam-Bashforth 或 Runge-Kutta 一起使用的方法,但无济于事。


