计算偏导数时的分割误差

问题描述

我试图在点f(x,y)=x+y上计算函数xy(3,2)的偏导数。我编写了代码,但它给了我一个称为Segmentation fault (core dumped)错误。我不是那个谁能指出这是什么问题?

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;

class Der{

private:
    double f;  // function value at x
    vector <double> df; // derivative of function at x
    
public:
    Der();
    Der(vector <double>* v);
    Der operator+(Der); // f + g
    
    void print();
    
};

Der :: Der(){}

Der :: Der(vector <double>* v){
    this->f = v->at(0);
    for(int i=1; i < v->size(); i++){
        this -> df[i-1] = v->at(i);
    }
}


Der Der :: operator+(Der g){
    Der h;
    h.f = this->f + g.f;
    for(int i=0; i< df.size(); i++){
        h.df[i] = this->df[i] + g.df[i];
    }
    return h;
}

void Der :: print(){
    cout<<"Function value at given point is : "<<f<<endl;
    for(int i=0; i< df.size(); i++){
    cout<<"Derivative at given point is : "<<df[i]<<endl;
    }
}

int main()
{
    Der f;
    vector <double> t {3,1,0};
    vector <double> k {2,1};
    Der x(&t),y(&k);
    
    f = x+y;
    f.print();
}

非常感谢您!

解决方法

在构造函数中,向量df为空,但您尝试使用将值放入向量中

this -> df[i-1] = v->at(i);

这将导致未定义的行为,因为您正在访问空向量的边界之外。一种解决方法是用以下代码替换该行:

df.push_back(v->at(i));

这将增加每次调用时引导程序的大小。

Der Der :: operator+(Der g){中,您还拥有:

h.df[i] = this->df[i] + g.df[i];

具有与构造函数相同的错误。 h.df为空。您可以使用以下方法解决此问题:

h.df.push_back(this->df[i] + g.df[i]);

就像c ++中提到的@πάνταῥεῖ一样,我们更喜欢通过const引用传递一个指针:

 Der :: Der(const vector <double>& v){