我有一个复杂的分析函数,我想对其进行数值导数。
现在,我可以通过复步法进行偏导,如
这里,是一个实数无穷小。
我想为一个通用的复杂分析函数实现这个。我从一个复杂的功能开始
#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;
}
这不起作用,因为我正在取的实部和虚部,它们都是实值函数,并且我无法在复步法中得到任何虚部,所以dfdz = 0
.
我希望这整个过程是数字的,这样我就不必分析计算实部和虚部并明确插入代码
在这种情况下如何实现复杂的步骤方法?