如何解决计算偏导数时的分割误差
我试图在点f(x,y)=x+y
上计算函数x
与y
和(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){
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。