zoukankan      html  css  js  c++  java
  • P1024 一元三次方程求解 |牛顿迭代法

    题目描述

    有形如:(ax^3+bx^2+cx^1+dx^0=0) 这样的一个一元三次方程。给出该方程中各项的系数((a,b,c,d)均为实数),并约定该方程存在三个不同实根(根的范围在(-100)(100)之间),且根与根之差的绝对值(ge 1)。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后(2)位。

    提示:记方程(f(x)=0),若存在(2)个数(x_1)​和(x_2)​,且(x_1<x_2)​,(f(x_1) imes f(x_2)<0),则在((x_1,x_2))之间一定有一个根。

    输入格式

    一行,(4)个实数(A,B,C,D)

    输出格式

    一行,(3)个实根,并精确到小数点后(2)位。


    这个方法确实有点大材小用

    #include<cmath>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define db double
    #define int long long
    const db eps=1e-6;
    db a,b,c,d;
    inline db f(db x){
    	return a*x*x*x+b*x*x+c*x+d;
    }
    inline db df(db x){
    	return 3*a*x*x+2*b*x+c;
    }
    inline db New(db x){
    	db xn=x-f(x)/df(x);
    	while(abs(xn-x)>eps){
    		x=xn;
    		xn=x-f(x)/df(x);
    	}
    	return xn;
    }
    vector<db>A;
    signed main(){
    	cin>>a>>b>>c>>d;
    	for(db i=-100;i<=100;i+=0.5)A.push_back(New(i));
    	sort(A.begin(),A.end());
    	A.push_back(102.00);
    	for(int i=1;i<A.size();i++)
    	if(A[i]-A[i-1]>eps)printf("%.2f ",A[i-1]);
    }
    
  • 相关阅读:
    [Leetcode]-- Largest Rectangle in Histogram
    Trapping Rain Water
    JNI和JNA性能比较
    Visual Studio开发Linux程序的方法
    Linux查看机器的硬件信息
    各语言的代码混淆工具
    类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast区别
    内存泄露的监测工具
    我们三十以后才明白
    我们三十以后才明白
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/12712844.html
Copyright © 2011-2022 走看看