0

我已经编写了代码,通过创建一个名为“Der”的类来计算单个变量函数的导数。在class Der中,我定义了两个私有变量double fanddouble df和一个print()函数来打印fand的值df。在类中,我重载了运算符+, -, *, /, ^ 来计算函数的和、差、乘等的导数。我不能展示整个代码,因为它很长,但我会展示一些片段来给出一个想法。

class Der{
private:
    double f;  // function value at x
    double df; // derivative of function at x
public:
    Der();
    Der(double);
    Der operator+(Der); // f + g
    Der operator-(Der); // f - g
    Der operator*(Der); // f * g
    Der operator/(Der); // f / g
       
    friend Der operator+(double, Der); //c+f
    friend Der operator-(double, Der); //c-f
    friend Der operator*(double, Der); //c*f
    friend Der operator/(double, Der); //c/f
    Der operator^(double); // f^c,  Where c is constant
   
    friend Der sin(Der);
    friend Der cos(Der);
    friend Der tan(Der);
    friend Der log(Der);
    friend Der exp(Der);
    
    void print();
};

Der :: Der(){}

Der :: Der(double x){
    this->f = x;
    this->df = 1;
}

Der Der :: operator+(Der g){
    Der h;
    h.f = this->f + g.f;
    h.df = this->df + g.df;
    return h;
}

Der sin(Der g){
    Der h;
    h.f = sin(g.f);
    h.df = cos(g.f)*g.df;
    return h;
}
void Der :: print(){
    cout<<"Derivative of function at a point : "<<df<<endl;
}

int main()
    {
        Der x(10), f;
        f = x^2+x^3;
        f.print();
    }

现在我想用这个导数计算器来计算几个变量函数的偏导数,并最终计算出该函数的梯度。我有一些模糊的想法,但我无法在代码中实现它。我是 C++ 编程的初学者,所以如果你不使用太多高级概念会很有帮助。

任何形式的帮助将不胜感激。谢谢!

编辑:我已经添加了如何Der使用。该程序应该接受自变量的输入,例如x(2), y(4), z(5)和函数f(x,y,z)=x^2*y*z+log(x*y*z)。然后,它将以数组的形式给出fwrtx, y, z在 point 处的偏导数。(2, 4, 5)但是,我只需要一些关于如何编写偏导数计算器的想法。

4

1 回答 1

3

您似乎非常接近解决方案,但在跨多个维度定义函数的步骤中挣扎。

您需要多个成员变量,而不是一个成员变量df,每个偏导数一个。您可以对它们进行硬编码:

double dfx, dfy, dfz;

或使用容器:

double df[3];

我现在将使用硬编码。(容器是一个非常重要的话题,astd::vector在几乎所有方面都比数组好,但一次只做一件事。)

将另一个变量从 重命名为 也是明智的xv因为它表示函数在感兴趣点处的,而不是该点的位置。(这值得思考。)

旧的构造函数采用一个值和一个导数:

Der :: Der(double x){
    this->f = x;
    this->df = 1;
}

这可以使用初始化器更好地编写:

Der :: Der(double nx): x(nx), df(1)
{}

这使得重写构造函数以获取三个偏导数变得容易:

Der :: Der(double nv, double dx, double dy, double dz): v(nv), dfx(dx), dfy(dy), dfz(dz)
{}

现在我们可以声明函数:

Der x(2, 1, 0, 0), y(4, 0, 1, 0), z(5, 0, 0, 1);

算术运算的逻辑很简单。例如,两个函数乘积的第一部分:

dfx = A.v * B.dfx + A.dfx * B.v;

(事实上​​,您可以从当前类中抽象出算术并将其用于新旧类,但一次只做一件事。)

于 2020-10-19T17:14:06.120 回答