怎样编程计算3次方程的根

 我来答
fbingqiang
2010-11-27 · 超过20用户采纳过TA的回答
知道答主
回答量:93
采纳率:0%
帮助的人:51.9万
展开全部
就不能给我准确结果???
我想你是不理解编程语言对数据的存储方式。小数在计算机中是不能准确表示的,如2.9999998、2.9999997结果是3。所以,你想准确表示小数是不可能的,只能在一定范围内是准确的,如误差小于0.000001...所以
左值(result) - 右值(0)的误差小于0.000001就算是解

用C++编写的,已经编译运行调试,测试方程如下:
// 3x(3)+2x(2)+x(1)-6=0
// x(3)+10x(2)+x(1)+1=0

在编程中求解方程的解都是用“穷举”的思想(转化为程序就是循环)进行的,即不断判断在一定的数据范围内存不存在解。所以运算的次数会很多很多!

//@@@@@@@@@@@
double x=-0.001; //假设解的最小值,根据方程情况决定!
double M=100; //假设解的最大值,根据方程情况决定!
//@@@@@@@@@@@
根据方程情况决定!可以修改,但要控制好循环次数哦,假如你设置为x=-0.00001,M=1000000。估计程序要运行个几分钟才结束,搞不好死机哦。

说得这么详细,一定要给分哦!

#include <math.h> //pow、fabs函数在这个库里
#include <iostream>
using namespace std;

double x=-0.001; //假设解的最小值double M=100; //假设解的最大值
void main()
{
double a,b,c,d,result;
cout<<"输入a,b,c,d: ";
cin>>a>>b>>c>>d;
while (1)
{
//左值(result) - 右值(0)的误差小于0.000001就算是解
result=a*pow(x,3)+b*pow(x,2)+c*pow(x,1)+d;
if ( fabs(result-0)<0.000001 )//fabs是求绝对值
{
cout<<"ax(3)+bx(2)+cx(1)+d=O的解是x="<<x<<endl;
break; //结束程序
}

if (x>M)
{
cout<<"无解!"<<endl;
break;//结束程序
}

x += 0.00001; //每次增加0.00001
}
}

根据这个题目的思想,你可以编写出一元10次方程的求解方法!把result=a*pow(x,3)+b*pow(x,2)+c*pow(x,1)+d;
这里改变,增长一点就可以了,依次是a*pow(x,10)+ b*pow(x,9)+...
wacs5
2010-11-27 · TA获得超过1.6万个赞
知道大有可为答主
回答量:3724
采纳率:82%
帮助的人:2890万
展开全部
三次方程的根是有公式的。
具体公式请上网查找一下。
下面是用C写的。

/*****************************************************************
*Author :wacs5
*DATE :20101127(YYYMMDD)
*Email :wacs5@126.com
*Function :求一元三次方程的根
*Compiler :TC2.0通过(如果是VC++的话,去掉#include <conio.h>)
* *另外getch()函数可以换成system("pause")语句.
*****************************************************************/
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define PI 3.14159265358979323846
#define tol 1e-7
int main(void)
{
double a=1,b=-6,c=11,d=6;
double p,q,D,u,v;
double y1,y2,y3;
double x1,x2,x3;
double cubic_root(const double a);

p=(3*c/a-b*b/a/a)/3.0;
q=(2*b*b*b/a/a/a-9*b*c/a/a+27*d/a)/27;
D=p*p*p/27+q*q/4;

if (D>=0)
{
printf("/************Only one real root************/\n");
v=sqrt(D);
u=cubic_root(-q/2+v);
v=cubic_root(-q/2-v);
y1=u+v;
y2=-(u+v)/2;
y3=(u-v)/2*sqrt(3);
u=b/3.0/a;
y2-=u;
x1=y1-u;
printf("x1=%lf\nx2=%lf+i*%lf\nx3=%lf-i*%lf\n",x1,y2,y3,y2,y3);
}
else /* three real root */
{
printf("/************three real root************/\n");
if (p<0)
p=-p;
u=acos(-q/2*pow(p/3,-1.5));
v=sqrt(p/3);
y1=2*v*cos(u/3);
y2=-2*v*cos((u+PI)/3.0);
y3=-2*v*cos((u-PI)/3.0);
u=b/3.0/a;
x1=y1-u;
x2=y2-u;
x3=y3-u;
printf("x1=%lf\nx2=%lf\nx3=%lf\n",x1,x2,x3);
}
getch();
}

double cubic_root(const double a)
{
double x1,x2=1e4;
x1=(a>0)?1:-1;
while(fabs(x2-x1)>tol)
{
x2=x1;
x1=2.0/3*x2+a/3/x2/x2;
}
return x1;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2010-11-27
展开全部
看看有关计算算法的书籍,无限逼近就可以了,如二分法学迭代法都可以
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式