Codevs 1038 一元三次方程求解 NOIP 2001(导数 牛顿迭代)
2017-02-06 16:47
351 查看
1038 一元三次方程求解 2001年NOIP全国联赛提高组
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
题目描述 Description
有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:记方程f(x)=0,若存在2个数x1和x2,且x1
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
题目描述 Description
有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:记方程f(x)=0,若存在2个数x1和x2,且x1
/* 导数+勘根定理+牛顿迭代. 先对函数求导,f'(x)=3ax^2+2*bx+c. 然后直接求根公式求f'(x)=0的点,也就是函数极点. (我们可以顺便求一下凸形函数极值hhh) 这题保证有三个不定根,所以有两个单峰. 我们分别设这两个点为p,q. 然后显然的必有三个根分别在[-100,p),[p,q],(q,100]三个区间内 (两极点间必定存在零点,勘根定理). 然后用神奇的牛顿迭代法多次迭代就好了. 证明请自行百度,本蒟蒻只能感性的认识orz. */ #include<iostream> #include<cstdio> #include<cmath> #define eps 1e-4 using namespace std; double x1,x2,x3,a,b,c,d; double f(double x){return a*x*x*x+b*x*x+c*x+d;} double df(double x){return 3*a*x*x+2*b*x+c;} double slove(double l,double r) { double x,x0=(l+r)/2; while(abs(x0-x)>eps) x=x0-f(x0)/df(x0),swap(x0,x); return x; } int main() { cin>>a>>b>>c>>d; double p=(-b-sqrt(b*b-3*a*c))/(3*a); double q=(-b+sqrt(b*b-3*a*c))/(3*a); x1=slove(-100,p),x2=slove(p,q),x3=slove(q,100); printf("%.2lf %.2lf %.2lf",x1,x2,x3); return 0; }
相关文章推荐
- [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)
- Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)
- 洛谷 P1027 CODE[VS] 1041 [NOIP2001 T4] Car的旅行路线
- Codevs 1038 一元三次方程求解
- 【codevs1038 一元三次方程求解】分治
- vijos p1116(codevs 1038 )一元三次方程求解 题解
- NOIP2001 一元三次方程求解[导数+牛顿迭代法]
- 【vijos 1116】【codevs 1038】一元三次方程求解
- 【CodeVS1101】【NOIP2002】矩形覆盖
- codevs 3287||NOIP 2013 货车运输 最大生成树+倍增 解题报告
- 宽度优先搜索 之 CODE[VS] 1099 字串变换 2002年NOIP全国联赛提高组
- codevs1288埃及分数-迭代加深搜索
- NOIP 国王游戏 codevs1198 贪心+高精度
- codevs 1013 求先序排列 2001年NOIP全国联赛普及组 x
- 【codevs1200】 NOIP2012—同余方程
- CODE[VS] 1198【NOIP2012】 国王游戏(贪心
- codevs 1169 传纸条(NOIP)
- 【NOIP2014】UOJ #19 CODE[VS] 3731 寻找道路 反向建图+SPFA
- Codevs 1169 传纸条 2008年NOIP全国联赛提高组
- [NOIP2005][CODEVS1106]篝火晚会(模拟+数学相关)