如何实现复杂函数的复杂阶跃导数?

计算科学 有限差分 数字 复分析
2021-12-28 04:07:02

我有一个复杂的分析函数,我想对其进行数值导数。

f(z)f(x,y)=u(x,y)+iv(x,y)df(z)dz=limh0f(z+h)f(h)h=u(x,y)x+iv(x,y)x

现在,我可以通过复步法进行偏导,如

u(x,y)x=limh0u(x+ih,y)hv(x,y)x=limh0v(x+ih,y)hdf(z)dz=limh0[u(x+ih,y)h+iv(x+ih,y)h]

这里,h是一个实数无穷小。

我想为一个通用的复杂分析函数实现这个。我从一个复杂的功能开始

#include<complex>
#include<iostream>
#include<limits>
using namespace std;

complex <double> f(complex< double > z) { return z*z; }
complex <double> u(complex< double > z) { return real(f(z)); }
complex <double> v(complex< double > z) { return imag(f(z)); }

double h = std::numeric_limits<double>::epsilon();
double h_inv = 1./std::numeric_limits<double>::epsilon();
int main()
{
    //Calculating derivative at z = 1 + I;
    double x = 1; y = 1;
    complex<double> xh{x.,h};
    complex<double> z = xh+complex<double>(0,y);
    complex<double> dudx = imag(u(z))*h_inv;
    complex<double> dvdx = imag(v(z))*h_inv;
    complex<double> dfdz{dudx,dvdx};
    return 0;
}

这不起作用,因为我正在取f的实部和虚部,它们都是实值函数,并且我无法在复步法中得到任何虚部,所以dfdz = 0.

  • 我希望这整个过程是数字的,这样我就不必分析计算实部和虚部并明确插入代码

  • 在这种情况下如何实现复杂的步骤方法?

1个回答

恐怕该方法仅适用于计算实值函数的导数(您碰巧有一个也适用于复数值的实现)。