Can you solve this equation?

    xiaoxiao2022-12-05  36

    http://acm.hdu.edu.cn/showproblem.php?pid=2199

    题意:求函数零点;

    总结:牛顿迭代法

     

    (次要):

    不动点迭代:构造收敛函数g(x),取偶次方开根号;g(x)==x;

    弦截法:很容易tle,但不用求导;

    #include<algorithm> #include<set> #include<queue> #include<cmath> #include<cstring> #include<iostream> #include<set> #include<vector> #include<queue> #include<cmath> #include<cstdio> #include<map> #include<stack> #include<string> #include<bits/stdc++.h> using namespace std; #define sfi(i) scanf("%d",&i) #define pri(i) printf("%d\n",i) #define sff(i) scanf("%lf",&i) #define ll long long #define ull unsigned long long #define mem(x,y) memset(x,y,sizeof(x)) #define INF 0x3f3f3f3f #define eps 1e-16 #define PI acos(-1) #define lowbit(x) ((x)&(-x)) #define zero(x) (((x)>0?(x):-(x))<eps) #define fl() printf("flag\n") #define MOD(x) ((x%mod)+mod)%mod #define endl '\n' #define pb push_back #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) const int maxn=1e6+9; const int mod=1e9+7; inline ll read() { ll f=1,x=0; char ss=getchar(); while(ss<'0'||ss>'9') { if(ss=='-')f=-1;ss=getchar(); } while(ss>='0'&&ss<='9') { x=x*10+ss-'0';ss=getchar(); } return f*x; } double Dis(int x1,int y1,int x2,int y2) { return sqrt((double)(x1-x2)*(x1-x2)+(double)(y1-y2)*(y1-y2)); } double F(double x) { return 8*pow(x,4.0)+7*pow(x,3.0)+2*pow(x,2.0)+3*x+6; } double Fdao(double x) { return 32*pow(x,3.0)+21*pow(x,2.0)+4*x+3; } double G(double x,double y) { return pow((double)(-7*pow(x,3.0)-2*pow(x,2.0)-3*x-6+y)/8.0,1.0/4.0); } int main() { //FAST_IO; //freopen("input.txt","r",stdin); int t; cin>>t; while(t--) { double y; cin>>y; if(F(0)>y||F(100)<y) { cout<<"No solution!"<<endl; continue; } //二分 /*double l=0; double r=100; double ans=0; while((r-l)>1e-6) { double mid=(l+r)/2.0; if(F(mid)-y>eps) { ans=mid; r=mid; } else l=mid; } printf("%.4lf\n",ans);*/ //牛顿迭代 double f,fx,x,x1=1;//起点 do { x=x1; f=F(x)-y; fx=Fdao(x); x1=x-f/fx; }while(fabs(x1-x)>=1e-8); printf("%.4lf\n",x1); //不动点迭代 /*double x1=1,x; do { x=x1; x1=G(x1,y); }while(fabs(x1-x)>=1e-8); printf("%.4lf\n",x1);*/ //弦截法,tle了!!!! /*double x1=2,x0=1,x2; do { x0=x1; x1=x2; x2=x1-((F(x1)-y)*(x1-x0))/((F(x1)-y)-(F(x0)-y)); }while(fabs(x2-x1)>=1e-3); printf("%.4lf\n",x2);*/ } return 0; }

     

    最新回复(0)