普及-水题求调
查看原帖
普及-水题求调
482610
Mortidesperatslav楼主2023/6/27 21:46

P1024,我用牛迭,算出来三个实根相同,应该怎么解决(

#include<bits/stdc++.h>
using namespace std;
double xs[105];
double dxs[105];
int n;
double qpow(double x,int n){
	double res=1.000;
	while(n){
		if(n&1)res*=x;
		x*=x;
		n>>=1;
	}
	return res;
}
double f(double x){
    double res=0.000;
    for(register int i=0;i<=n;i++)res=res+(double)(qpow(x,i)*(double)xs[i]);
    return res;
}
double f_(double x){//f'(x)用f_(x)代替 
    double res=0.000;
    for(register int i=0;i<=n-1;i++)res+=(double)(qpow(x,i)*(double)dxs[i]);
    return res;
}
int main(){
    n=3;//n是最高次数 
    for(register int i=n;i>=0;i--){
        cin>>xs[i];
        if(i!=0)dxs[i-1]=xs[i]*(double)i;//求导,注意任意常数导数为0 
    }
    double x0=100.00;/*x0是初始近似解,可以调整*/
    while(abs(f(x0))>1e-6){
		double tmp=x0;
		x0-=(f(tmp)/f_(tmp));//求近似解,控制精度误差
	}
	double x1=x0-1.0;
	while(abs(f(x1))>1e-6){
	    double tmp=x1;
		x1-=(f(tmp)/f_(tmp));//求近似解,控制精度误差
	}
	double x2=x1-1.0;
	while(abs(f(x2))>1e-6){
		double tmp=x2;
		x2-=(f(tmp)/f_(tmp));
	}
    printf("%lf %lf %lf",x2,x1,x0);
}
2023/6/27 21:46
加载中...