原題:(如下)
【問題描述】
給定三次函數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()的用法,還有浮點數的準確表示