Tsinsen A1094 牛頓迭代法求方程的根

原題:(如下)

【問題描述】
  給定三次函數f(x)=ax3+bx2+cx+d的4個係數a,b,c,d,以及一個數z,請用牛頓迭代法求出函數f(x)=0在z附近的根,並給出迭代所需要次數。
  牛頓迭代法的原理如下(參考下圖):
  設xk是方程f(x)=0的精確解x*附近的一個猜測解,過點Pk(xk,f(xk))作f(x)的切線。該切線與x軸的交點比xk更接近方程的精確解程x*。
  迭代公式爲:xk+1= xk - f(xk)/f '(xk),當f(x)的絕對值足夠小的時候即可結束迭代。
  注意:對於本題給定函數f(x),f '(x)=3ax2+2bx+c,且當|f(x)| ≤10-7時,即可認爲x是f(x)=0的根。


【輸入格式】
  輸入共2行。
  第一行爲4個整數,每2個數之間用一個空格隔開,分別是a,b,c,d
  第二行爲一個實數z。
【輸出格式】
  共一行。包含2個數,之間用一個空格隔開,第一個數是實數x,表示所求的根,精確到小數點後3位;第二個數是一個整數n,表示求得上述根需要的迭代次數。
【樣例輸入】
  2 -9 5 3
  3

【樣例輸出】
  3.719 7

【提示】
  程序中需要使用浮點數時,請用double類型


AC代碼:

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

int a,b,c,d;
double f(double x){
	return a*pow(x,3)+b*pow(x,2)+c*x+d;
}
double ff(double x){
	return a*3*pow(x,2) + 2*b*x+c;
}
int main(){
	int t = 1;
	double x;
	cin>>a>>b>>c>>d>>x;
	while (abs(f(x))>= 1e-7){
		++t;
		x = x-(f(x)/ff(x));
	}
	printf("%.3lf %d",x,t); 
}

考點:

關於abs()和pow()的用法,還有浮點數的準確表示

發佈了29 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章