标签:一元 方程 xn 实根 df db P1024 迭代法 include
题目描述
有形如:\(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) \times 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]);
}
标签:一元,方程,xn,实根,df,db,P1024,迭代法,include 来源: https://www.cnblogs.com/naruto-mzx/p/12712844.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。