MATLAB中复数函数导数的数值计算

MATLAB中复数函数导数的数值计算,matlab,math,complex-numbers,derivative,Matlab,Math,Complex Numbers,Derivative,我想在MATLAB中数值计算复值函数(全纯函数)的导数 我已经在复平面上的网格中计算了函数,并且我尝试使用柯西-黎曼关系计算导数 鉴于: u=real(f),v=imag(f),x=real(点),y=imag(点) 导数应为:f'=du/dx+i dv/dx=dv/dy-i du/dy 其中“d”是导数运算符 我尝试了以下代码: stepx = 0.01; stepy = 0.01; Nx = 2/stepx +1; Ny = 2/stepy +1; [re,im] = meshgrid([-

我想在MATLAB中数值计算复值函数(全纯函数)的导数

我已经在复平面上的网格中计算了函数,并且我尝试使用柯西-黎曼关系计算导数

鉴于: u=real(f),v=imag(f),x=real(点),y=imag(点)

导数应为:f'=du/dx+i dv/dx=dv/dy-i du/dy

其中“d”是导数运算符

我尝试了以下代码:

stepx = 0.01;
stepy = 0.01;
Nx = 2/stepx +1;
Ny = 2/stepy +1;
[re,im] = meshgrid([-1:stepx:1], [-1:stepy:1]);
cplx = re + 1i*im;
z = cplx.^3;
衍生工具应为:

f1 = diff(real(z),1,2)/stepx +1i* diff(imag(z),1,2)/stepx;

但这两个被认为相等的导数并不匹配

我做错了什么


让我们计算小于stepx的元素数(假设stepx=stepy):

lm=min(尺寸(f1));
A=f1(1:lm,1:lm);
B=f2(1:lm,1:lm);

总和(绝对值)(A-B)问题是,使用两个不同的表达式,在Matlab中使用离散化,计算复平面上不同点的近似导数。假设你在虚值y处,计算沿实轴x的差值,然后第i个差值估计
(x(i)+x(i+1))处的导数/2
,即在两个后续x值之间的所有中点处。另一种方法是估计给定x处但在两个后续y值之间的所有中点处的导数

这也会导致结果矩阵的大小不同。使用第一个公式可以得到大小为201x200的矩阵,另一个是大小为200x201的矩阵。这是因为在第一个变量中,沿x有200个中点,但沿y有201个值,反之亦然

所以答案是,你没有做错任何事,你只是错误地解释了结果


可以通过沿其他维度(不用于导数的维度)显式插值来解决此问题:

其中,
f1
根据第一个公式计算,而
f2
根据第二个公式计算。现在,两个导数都在两个维度的中点处求值,这就是为什么两个矩阵的大小都是200x200

如果你现在比较它们,你会发现它们在数值误差上是相同的(毕竟,
diff
只计算近似导数,
interp1
产生插值误差)。对于你的步长,这个误差最大为1e-4,可以通过使用较小的步长进一步减小

f2 = diff(imag(z),1,1)/stepy - 1i* diff(real(z),1,1)/stepy;
lm = min(size(f1));
A = f1(1:lm,1:lm);
B = f2(1:lm,1:lm);

sum(sum(abs(A - B) <= stepx))
f1i = interp1(1 : Ny, f1, 1.5 : Ny);
f2i = interp1(1 : Nx, f2 .', 1.5 : Nx) .';

sum(sum(abs(f1i - f2i) <= stepx))
f1i = interp1(1 : Ny, f1, 1.5 : Ny);
f2i = interp1(1 : Nx, f2 .', 1.5 : Nx) .';