测试一维泊松求解器

计算科学 matlab 有限差分 泊松
2021-12-25 12:23:05

我正在尝试测试一个简单的一维泊松求解器,以表明有限差分方法与O(h2)并且对输入函数使用延迟校正会产生与O(h4).

所以,方程是u=f边界条件我尝试使用的方法是使用离散化运算符u(0)=u(1)=0

A=[210000121000012100001210000121000012]

(示例矩阵是。)然后求解我已经证明,理论上这应该与收敛,但是当我在 Matlab 上测试它时,我只得到收敛。h=15Au=h2fO(h2)O(h)

然后,我正在尝试我的课程讲师所说的“延迟更正”,并在解决之前我得出的结论是,更正应该是我已经证明这应该与收敛,但在 Matlab 中我仍然得到fff+h212AfO(h4)O(h)

这是 Matlab 脚本:

function [u err] = threeptsolve(ureal, du2, h)

% INPUT: 'ureal' is the function handle for the real solution.
%        'du2' is the function handle for the second derivative of 'ureal'
%        'h' is the step size
% OUTPUT: 'u' is the approximated solution
%         'err' is the error at each point

x = [0:h:1]';
n = length(x);
f = -du2(x);
realu = ureal(x);

A = 2 * eye(n);
A = A + diag(-1*ones(n-1,1), 1) + diag(-1*ones(n-1,1), -1);
A = (1/h^2) * A;

% uncomment if using deferred correction
% f = f + h^2/12 * A * f;

u = A\f;

err = (realu - u);

end

当我使用一些示例平滑函数(具有适当的边界值)尝试此操作,然后使用再次尝试时,我在计算时得到(近似)二的向量h/2err1 ./ err2(1:2:end)

我的数学错了,还是我的代码?

2个回答

的表述假设为零,这是正确的。但是,您随后会在处包含您的边界。您的确切答案满足这些后来的 BC,但不满足中强加的 BC 。这些不连续性会导致您失去更高阶的准确性。要获得二阶收敛,您只需更改一行:Au0un+1u1unA

x = [0:h:1]';

x = [h:h:1-h]';

当我执行时,我得到一列 4(用于二阶转换)err1 ./ err2(2:2:end-1)(注意移位 1 个索引,因为解决方案现在排列在偶数索引而不是奇数)。我还没有从您的“延迟更正”中获得第四个订单,但这解决了您的部分问题。

对于缺陷校正,您将需要四阶离散化。成为您的二阶离散化,让成为四阶离散化。然后缺陷修正变为 由于缺陷修正收敛所以项取消,你已经解决了四阶离散化而没有“反转”关于需要多少次迭代有充分的理论,例如参见 Hackbush,Multi-grid methods and applications,Springer 1985。A2u=f2A4u=f4

A2u(0)=f2A2u(k)=f4A4u(k1)+A2u(k1)k=1,2,...
u(k)u(k1)A2uA4