均值去除是否会提高数值微分的准确性?

计算科学 线性代数 有限差分 数值分析 浮点 数值限制
2021-12-20 21:16:27

我希望通过数值微分计算向量的导数。比方说,我们使用标准的二阶中心差分方案来得出微分矩阵,并将其应用于数值向量u

u=Du

在生成的导数向量的顶部和底部的几个元素中,即使使用复杂的模板,我也会得到虚假的数值舍入。

现在,如果我从向量的每个元素中删除平均值,然后将其与我的微分矩阵预乘,D

u~=D(umean(u))

它似乎得到了更好的结果(即更好的准确性),尽管并不完全准确。

对于我正在使用的这个特定向量,我是否碰巧幸运,或者是否有一个基本的数学原因为什么相同的微分矩阵在均值去除的输入向量上表现出色?

1个回答

我从你的另一个问题中举了一个例子,并试图在这里展示发生了什么。因此,为了完整性:

我们使用以下代码应用 6 阶有限差分方案进行数值微分。首先,让我们将其应用于不同尺度的常数函数():C1,C2,C3

U(x)=C,x[0,1]
由于,因此微分的预期结果为零-向量。dU(x)dx=0

我使用 =100 个离散点N

  1. C1=2.5545007102,显示为蓝色
  2. C2=2.5545007104,以红色显示(您描述的问题的原始比例)
  3. C3=2.5545007106,显示为黑色

函数(实线)以及它的导数在没有平均减法(圆圈标记)和平均减法(交叉标记)的情况下计算在下图中。所有的交叉点都恰好在处(我必须分配一个虚拟值才能在半对数图上显示它们),这是常量函数的预期行为,正如 Kirill 在评论中提到的那样。因为您正在传递给微分子程序(或)零向量。 0Umean(U)=0在此处输入图像描述

现在,考虑一个稍微复杂一点的函数

U(x)=Csin(x),x[0,1]
因为,您还希望得到的零向量,并且问题的规模相似到上面具有恒定功能的那些。 dU(x)dx=Ccos(x)dU(x)dxCcos(x)在此处输入图像描述

对于,平均减法对提高计算导数的准确性没有任何作用。sin

所以一般来说,减去平均值(即常数)对于比常数更复杂的函数没有太大帮助。

关于数值微分对四舍五入敏感的问题,您已经在这两个问题的评论中得到了几个很好的答案。

Matlab 代码的完整性。该功能在此处dss006可用

xmin=0;    xmax=1;
N=100;
x=linspace(xmin,xmax,N);

fudge=1E-17;
cU1=2.5545007E+2;    cU2=2.5545007E+4;    cU3=2.5545007E+6;
U1=cU1*ones(N,1);    U2=cU2*ones(N,1);    U3=cU3*ones(N,1);
W1=cU1*sin(x);    W2=cU2*sin(x);    W3=cU3*sin(x);
dUx1=dss006(xmin,xmax,N,U1);
dUx2=dss006(xmin,xmax,N,U2);
dUx3=dss006(xmin,xmax,N,U3);
dUx1p=dss006(xmin,xmax,N,U1-mean(U1))+fudge;
dUx2p=dss006(xmin,xmax,N,U2-mean(U2))+fudge;
dUx3p=dss006(xmin,xmax,N,U3-mean(U3))+fudge;
dWx1=dss006(xmin,xmax,N,W1);
dWx2=dss006(xmin,xmax,N,W2);
dWx3=dss006(xmin,xmax,N,W3);
dWx1p=dss006(xmin,xmax,N,W1-mean(W1))+fudge;
dWx2p=dss006(xmin,xmax,N,W2-mean(W2))+fudge;
dWx3p=dss006(xmin,xmax,N,W3-mean(W3))+fudge;

%% ONLY PLOTTING AFTER THIS POINT
MarkerSize=7;    LineWid=2.5;    ff=22;  MyLineWidth=1.0;
set(groot,'DefaultTextInterpreter','latex');
set(groot,'defaultLegendInterpreter','latex');
set(groot,'defaultAxesTickLabelInterpreter','latex'); 

figure(1)
ph(1)=semilogy(x,abs(U1),'b-','LineWidth',MyLineWidth);hold on;
p1_str='$|U_1(x)|,\;C_1=2.5545007\cdot 10^2$';
ph(2)=semilogy(x,abs(U2),'r-','LineWidth',MyLineWidth);hold on;
p2_str='$|U_2(x)|,\;C_2=2.5545007\cdot 10^4$';
ph(3)=semilogy(x,abs(U3),'k-','LineWidth',MyLineWidth);hold on;
p3_str='$|U_3(x)|,\;C_3=2.5545007\cdot 10^6$';
ph(4)=semilogy(x,abs(dUx1),'bo','LineWidth',MyLineWidth);hold on;
p4_str='$|\widetilde{dU_1/dx}(x)-0|$';
ph(5)=semilogy(x,abs(dUx2),'ro','LineWidth',MyLineWidth);hold on;
p5_str='$|\widetilde{dU_2/dx}(x)-0|$';
ph(6)=semilogy(x,abs(dUx3),'ko','LineWidth',MyLineWidth);hold on;
p6_str='$|\widetilde{dU_3/dx}(x)-0|$';
ph(7)=semilogy(x,abs(dUx1p),'bx','LineWidth',MyLineWidth);hold on;
p7_str='$|\widetilde{dU_1/dx}(x)-0|$,$-$mean($U_1$)';
ph(8)=semilogy(x,abs(dUx2p),'rx','LineWidth',MyLineWidth);hold on;
p8_str='$|\widetilde{dU_2/dx}(x)-0|$,$-$mean($U_2$)';
ph(9)=semilogy(x,abs(dUx3p),'kx','LineWidth',MyLineWidth);hold on;
p9_str='$|\widetilde{dU_3/dx}(x)-0|$,$-$mean($U_3$)';
title('$U(x)=C$');    grid on; set(gca,'FontSize',ff-2);
xlabel('$x$','FontSize',ff); 
ylabel('$|U(x)|, |\widetilde{\frac{dU}{dx}}(x)-\frac{dU}{dx}(x)|$','FontSize',ff);
h=legend([ph(1) ph(2) ph(3) ph(4) ph(5) ph(6) ph(7) ph(8) ph(9)],p1_str,p2_str,p3_str,p4_str,p5_str,p6_str,p7_str,p8_str,p9_str,'Location','Best');
h.FontSize=ff-6;    h.EdgeColor=[1. 1. 1.];
ylim([1E-17 1E+9]);
set(gca,'YTick',[1E-15 1E-12 1E-9 1E-6 1E-3 1E-0 1E+3 1E+6 1E+9]);

figure(2)
ph(1)=semilogy(x,abs(W1),'b-','LineWidth',MyLineWidth);hold on;
p1_str='$|U_1(x)=C_1\sin(x)|,\;C_1=2.5545007\cdot 10^2$';
ph(2)=semilogy(x,abs(W2),'r-','LineWidth',MyLineWidth);hold on;
p2_str='$|U_2(x)=C_2\sin(x)|,\;C_2=2.5545007\cdot 10^4$';
ph(3)=semilogy(x,abs(W3),'k-','LineWidth',MyLineWidth);hold on;
p3_str='$|U_3(x)=C_3\sin(x)|,\;C_3=2.5545007\cdot 10^6$';
ph(4)=semilogy(x,abs(dWx1-cU1*cos(x)),'bo','LineWidth',MyLineWidth);hold on;
p4_str='$|\widetilde{dU_1/dx}(x)-C_1\cos(x)|$';
ph(5)=semilogy(x,abs(dWx2-cU2*cos(x)),'ro','LineWidth',MyLineWidth);hold on;
p5_str='$|\widetilde{dU_2/dx}(x)-C_2\cos(x)|$';
ph(6)=semilogy(x,abs(dWx3-cU3*cos(x)),'ko','LineWidth',MyLineWidth);hold on;
p6_str='$|\widetilde{dU_3/dx}(x)-C_3\cos(x)|$';
ph(7)=semilogy(x,abs(dWx1p-cU1*cos(x)),'bx','LineWidth',MyLineWidth);hold on;
p7_str='$|\widetilde{dU_1/dx}(x)-C_1\cos(x)|$,$-$mean($U_1$)';
ph(8)=semilogy(x,abs(dWx2p-cU2*cos(x)),'rx','LineWidth',MyLineWidth);hold on;
p8_str='$|\widetilde{dU_2/dx}(x)-C_2\cos(x)|$,$-$mean($U_2$)';
ph(9)=semilogy(x,abs(dWx3p-cU3*cos(x)),'kx','LineWidth',MyLineWidth);hold on;
p9_str='$|\widetilde{dU_3/dx}(x)-C_3\cos(x)|$,$-$mean($U_3$)';
title('$U(x)=C\sin(x)$');    grid on; set(gca,'FontSize',ff-2);
xlabel('$x$','FontSize',ff);
ylabel('$|U(x)|, |\widetilde{\frac{dU}{dx}}(x)-\frac{dU}{dx}(x)|$','FontSize',ff);    
h=legend([ph(1) ph(2) ph(3) ph(4) ph(5) ph(6) ph(7) ph(8) ph(9)],p1_str,p2_str,p3_str,p4_str,p5_str,p6_str,p7_str,p8_str,p9_str,'Location','Best');
h.FontSize=ff-6;    h.EdgeColor=[1. 1. 1.];
ylim([1E-17 1E+9]);
set(gca,'YTick',[1E-15 1E-12 1E-9 1E-6 1E-3 1E-0 1E+3 1E+6 1E+9]);