C++牛顿迭代法求一元方程的根

mac2024-12-09  40

题目描述:

给定方程x^5+2x^3=x^2+x+1=0;求方程的根的近似值。

提示:采用牛顿切线法求根,先给任意的x,求出f(x)做,函数在(x,f(x))的切线,交x轴于x2,然后再用求出f(x2),做 f(x)在(x2,f(x2))的切线交x轴于x3,重复上述过程,直到切点的横坐标于切线在x轴点横坐标差的绝对值小于1e-5.

##方法一:循环法,需要明确将哪些量放在循环体内,哪些量在外, #include <iostream> #include <cmath> using namespace std; double f1(double x1){ return 5*pow(x1,4.0)+6*pow(x1,2.0)-2*x1+x1; } double f(double x1){ return pow(x1,5.0)+2*pow(x1,3.0)-pow(x1,2.0)+1; } int main(){ double x2=0,x1=-0.6; while (true) { double fx=f(x1); double k=f1(x1); x2=x1-fx/k; if(abs(x2-x1)<1e-5){ break; } x1=x2; } cout<<x2<<endl; cout<<x1<<endl; system("pause"); return 0; } #方法二:递归法,不外乎三个问题? 1.递归函数的返回值是什么类型的? 2.结束递归的条件是什么? 3.如何调用自身(需要将那些量改变) #include <iostream> #include <cmath> using namespace std; void NewTon(double x1){ double fx=pow(x1,5.0)+2*pow(x1,3.0)-pow(x1,2.0)+1;//利用fx的表示计算fx double k=5*pow(x1,4.0)+6*pow(x1,2.0)-2*x1+x1;//利用f'x计算k double x2=x1+(-fx)/k;// if(abs(x2-x1)<1e-5){ cout<<x2<<endl<<x1<<endl; // cout<<fx; return; }else{ NewTon(x2);//x2为切点横坐标 } } int main(){ NewTon((double)5); cout<<endl; system("pause"); return 0; }

#答案: 觉得写的不错的小伙伴点赞关注哦😘。

最新回复(0)