有缺陷的一元三次方程求解设计(盛金公式)

先放代码:

#include <cmath>
#include <iostream>

//cube_sqrt.h

double abs(double x)
{
	if(x<=0)
		x=-x;
	return x;
}

double cube_sqrt(double x)
{
	if(x==0)
		return 0;
	double y, z;
	y=x;
	z=0;
	double middle;
	if(abs(x)>=1)
		middle=sqrt(abs(x));
	else if(x<1)
		middle=sqrt(sqrt(abs(x)));
	if(x<0)
		middle=-middle;
	for(int i=0; i<1000; ++i)
	{
		if(middle*middle*middle == x)
			return middle;
		else if(abs(middle*middle*middle) < abs(x))
			z = middle;
		else if(abs(middle*middle*middle) > abs(x))
			y = middle;
		middle = (y+z)/2;
	}
	return middle;
}


 

#include <cmath>
#include <vector>
#include "cube_sqrt.h"
using namespace std;

//equation_solution.h

vector<double> equation_solution_1(double a, double b, double c, double d)
{
	vector<double> result;
	double A = b*b-3*a*c;
	double B = b*c-9*a*d;
	double C = c*c-3*b*d;
	double D = B*B-4*A*C;
	if(A==B&&B==0)
	{
		for(int i=0; i<3; ++i)
			result.push_back(-b/(3*a));
		return result;
	}
	else if(D>0)
	{
		double Y1 = A*b+1.5*a*(-B+sqrt(D));
		double Y2 = A*b+1.5*a*(-B-sqrt(D));
		result.push_back((-b-cube_sqrt(Y1)-cube_sqrt(Y2))/(3*a));
		result.push_back((-b+0.5*(cube_sqrt(Y1)+cube_sqrt(Y2)))/(3*a));
		result.push_back((0.5*sqrt(3)*(cube_sqrt(Y1)-cube_sqrt(Y2)))/(3*a));
		result.push_back((-b+0.5*(cube_sqrt(Y1)+cube_sqrt(Y2)))/(3*a));
		result.push_back((-0.5*sqrt(3)*(cube_sqrt(Y1)-cube_sqrt(Y2)))/(3*a));
		return result;
	}
	else if(D==0)
	{
		result.push_back(-b/a+B/A);
		for(int i=0; i<2; ++i)
			result.push_back(-B/A/2);
		return result;
	}
	else if(D<0)
	{
		double co = cos((acos((2*A*b-3*a*B)/(2*sqrt(A*A*A))))/3);
		double sn = sin((acos((2*A*b-3*a*B)/(2*sqrt(A*A*A))))/3);
		result.push_back((-b-2*sqrt(A)*co)/(3*a));
		result.push_back((-b+sqrt(A)*(co+sqrt(3)*sn))/(3*a));
		result.push_back((-b+sqrt(A)*(co-sqrt(3)*sn))/(3*a));
		return result;
	}
}


 

#include <iostream>
#include <vector>
#include "equation_solution.h"
using namespace std;

// equation_solution_main.cpp

int main()
{
	cout << "您好!本程序专供求解三次方程,仅供学习和参考。" << endl;
	cout << "本程序仅处理方程的一般形式:ax^3+bx^2+cx+d=0" << endl << endl;
	double a, b, c, d;
	while(true)
	{
		system("pause");
		cout << "\n请输入三次项系数:";
		cin >> a;
		cout << "请输入二次项系数:";
		cin >> b;
		cout << "请输入一次项系数:";
		cin >> c;
		cout << "请输入常数项:";
		cin >> d;
		cout << "以下是方程的解:";
		vector<double> result = equation_solution_1(a,b,c,d);
		if(result.size()==3)
		{
			for(int i=0; i<3; ++i)
				cout << "x" << (i+1) << "=" << result[i] << endl;
		}
		if(result.size()==5)
		{
			if(result[2]>0)
				cout << "x1=" << result[0]
				<< "\nx2=" << result[1] << "+" << result [2]
				<< "i\nx3=" << result[3] << result [4]
				<< "i" << endl;
			else if(result[2]<0)
				cout << "x1=" << result[0]
				<< "\nx2=" << result[1] << result [2]
				<< "i\nx3=" << result[3] << "+" << result [4]
				<< "i" << endl;
		}
		cout << "求解完毕。\n" << endl;
	}
	return 0;
}



如标题,本一元三次方程求解运用的是盛金公式。速度较快,资源占用率也较低。

.NET的电脑不在身边,在一台古董上测试。Windows XP Visual C++ 6.0 测试通过。

两个小时做下来,感想如下:

1. abs运用了函数重载,C++标准库函数abs只支持int类型,不符合需求。

2. 立方根运用的是迭代(二分法),C++标准库函数pow函数精度不符合要求且不支持负数。

3. 没有做判别式无解判别,原因是没有必要。

4. 不是图形界面,仅为内核;控制台应用程序的cout还是花了较多时间设计的,尽量友好。

5. 重大缺陷:只支持方程的一般式,最终目标应为实现三次以下各类一元方程的求解。

6. 新手入门,望得到老手的指导。谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值