大家好,欢迎来到IT知识分享网。
/* 2011-09-21
f(x)=ax^3+bx^2+cx+d
分析:设三个根为 x0,x1,x2 有
f(x)=a(x-x0)(x-x1)(x-x2)有(韦达定理)
-b = a(x0+x1+x2)
c = a(x0x1+x1x2+x2x3)
-d = ax0x1x2
以 x0为已知量求解 x1,x2
x1 = 1/(2ax)(+sqrt((ax^2+bx)^2+4adx)-ax^2-bx)
x2 = 1/(2ax)(-sqrt((ax^2+bx)^2+4adx)-ax^2-bx)
接下来对 x在给定区间内进行二分即可
附韦达定理:
∑Xi=(-1)^1*A(n-1)/A(n)
∑XiXj=(-1)^2*A(n-2)/A(n)
…
ΠXi=(-1)^n*A(0)/A(n)
{A(n)对应度数的系数}
*/
#include <iostream>
#include <cstdlib>
#include <cmath>
#define esp 1e-6
using namespace std;
double f( double a, double b ,double c, double d, double x )
{
return a*x*x*x+b*x*x+c*x+d;
}
double x1( double a, double b ,double c, double d, double x )
{
return 1.0/(2.0*a*x)*(sqrt((a*x*x+b*x)*(a*x*x+b*x)+4.0*a*d*x)-a*x*x-b*x);
}
double x2( double a, double b ,double c, double d, double x )
{
return 1.0/(2.0*a*x)*(-sqrt((a*x*x+b*x)*(a*x*x+b*x)+4.0*a*d*x)-a*x*x-b*x);
}
int main()
{
double a,b,c,d;
double A,B,M;
while ( cin >> a >> b >> c >> d ) {
cin >> A >> B;
while ( B-A > esp ) {
M = (A+B)/2.0;
if ( f( a, b, c, d, M )*f( a, b, c ,d, A ) <= 0 )
B = M;
else A = M;
}
cout << M << " ";
cout << x1( a, b, c, d, M ) << " ";
cout << x2( a, b, c, d, M ) << " ";
cout << endl;
}
return 0;
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/12552.html