P1024 [NOIP2001 提高组] 一元三次方程求解,两种解法

解法一:使用暴力枚举

#include<iostream>  
#include<cmath>  
#include<iomanip>
using namespace std;  
  
int main(){  
    double a, b, c, d;  
    cin >> a >> b >> c >> d;  
    for(double i = -100.0; i <= 100.0; i += 0.01) {  
        double value = a * pow(i, 3) + b * pow(i, 2) + c * i + d;  
        if(fabs(value) < 0.001) {  
            cout<<fixed << setprecision(2) << i <<" ";
        }  
    }  
    return 0;  
}

这个方法就是把所有解的可能解一个一个的列举对比,符合条件就输出。这里一共有20000个,也不算多。是一个比较省时间的方法。但是缺点就是不能应用在数量大的题目上。

方法二:通过进行整数的列举去寻找,同时通过牛顿法迭代进行求解根

科普牛顿法:

基本原理

假设我们要求解方程 f(x)=0 的根,牛顿迭代法的基本思想是从一个初始猜测值 x0​ 开始,通过迭代公式逐步逼近真实的根。迭代公式为:

x_{n+1}=x_{n}-f(x_{n})/f{}'(x_{n})

其中,f′(xn​) 是函数 f(x) 在 xn​ 处的导数。

迭代过程

  1. 选择一个初始猜测值 x0​。
  2. 计算 f(x0​) 和 f′(x0​)。
  3. 使用迭代公式计算 x1​。
  4. 重复步骤 2 和 3,直到 \left | x_{n+1}- x_{n}\right |(即相邻两次迭代的差的绝对值)小于某个预定的容差 ϵ,或者达到预定的迭代次数。

 

#include<iostream>
#include<cmath>
#include<iomanip>//这个头文件是用来控制输出的精度0.01
using namespace  std;
void root(const float a,const float b,const float c,const float d,float x);
int main(){
	
	float a,b,c,d;
	cin>>a>>b>>c>>d;
	for(int i=-100;i<=100;i++){
			
			if((a*pow(i,3)+b*pow(i,2)+c*i+d)==0.00)
			{
				cout<<fixed << setprecision(2)<<i*1.00<<" ";
			}else if((a*pow(i,3)+b*pow(i,2)+c*i+d)>0&&(a*pow(i+1,3)+b*pow(i+1,2)+c*(i+1)+d)<0)
					{
						
						root( a,b,c, d, i);	
						
					}else if((a*pow(i,3)+b*pow(i,2)+c*i+d)<0&&(a*pow(i+1,3)+b*pow(i+1,2)+c*(i+1)+d)>0)
							{
								root( a,b,c, d, i);	
							}
	}
	return 0;
}

void root(const float a,const float b,const float c,const float d,float x){
	
	float num=x,x0,f,f1;
	do
	{
	x0=x;
	f=((a*x0+b)*x0+c)*x0+d;
	f1=(3*a*x0+2*b)*x0+c;
	x=x0-f/f1;
	if(fabs(f1)<1e-6)//这个是导数接近于零时退出,因为分母不能为0,这时候不能求出x就退出
	{
		break;
	}	
	}while(fabs(x-x0)>1e-6);//精度自己调整,仅做参考
	
	cout<<fixed << setprecision(2)<<x<<" ";//控制输出精度为两个小数(0.01)
	 
}

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一元三次方程是指形如ax^3+bx^2+cx+d=的方程,其中a、b、c、d都是已知常数,x是未知数。 求解一元三次方程的一般步骤如下: 1. 将方程化为标准形式,即将x^3系数化为1,即可得到x^3+px^2+qx+r=的形式。 2. 通过代数运算,将方程化为一个二次方程和一个一次方程的合形式,即x^3+px^2+qx+r=(x-a)(x^2+bx+c)的形式。 3. 解出二次方程x^2+bx+c=的两个根,即可得到三次方程的三个根,分别为a和二次方程的两个根。 求解一元三次方程的具体方法有很多,可以使用牛顿迭代法、三分法、高斯消元法等。在NOI竞赛中,一般使用高斯消元法来求解一元三次方程。 ### 回答2: 一元三次方程是指形如ax³+bx²+cx+d=0的方程,其中a、b、c、d都是已知系数,x是未知数。这是一个高阶多项式方程,求解方法也比较复杂。下面介绍一种较为常用的三次方程求解方法——套用“因式分解法”: 1. 将三次方程写成“因式分解”的形式,即(ax+b)(cx²+ex+f)=0,其中a、b、c、e、f都是已知系数,x是未知数。 2. 将第二个括号展开,得到cx³+(e+a)c²x+(f+ae+b)c+be=0。 3. 令y=cx,即方程变成了一个一元二次方程:y²+(e+a)y+(f+ae+b)c/be=0。 4. 解出y,再回代得到x的值。 需要注意的是,如果三次方程有重根或虚根,以上方法不适用,需要采用其他的求解方式。除此之外,还可以利用“维达定理”或牛顿迭代法等算法进行求解。 总之,求解一元三次方程需要掌握多种方法,根据具体情况选择合适的方法进行求解。在解题的过程中,要注意化简、观察特征、分析符号及系数等问题,同时也需要熟悉求根公式和基本的代数计算方法,才能顺利解决问题。 ### 回答3: 一元三次方程是指形如ax^3+bx^2+cx+d=0的方程,其中a、b、c、d为系数,x为未知数。解一元三次方程是高中数学中的一项重要内容,也是竞赛中常出现的题型。 解一元三次方程的方法有很多种,其中比较常用的有以下几种: 1.牛顿迭代法。该方法通常用于求解非线性方程,使用重复求解近似解的方法逼近准确解。但需要注意的是,该方法需要计算一定的导数,因此不太方便手工计算。 2.公式法。一元三次方程也有和一元二次方程一样的求根公式,但通常需要做一定的化简。比如,可以利用单项式恒等变形把一元三次方程化为一元二次方程,然后使用公式求解。 3.因式分解法。有些一元三次方程可以通过因式分解得到解,比如x^3-8=0,可以分解为(x-2)(x^2+2x+4)=0,从而得到三个解x=2、x=-1+i√3、x=-1-i√3。 4.牛顿-拉弗森法。该方法也是一种迭代方法,通常用于求根问题。但由于需要计算导数,因此不太适合手工计算。 总之,解一元三次方程需要根据具体情况选择合适的方法,并且需要注意精度问题,避免出现误差过大的情况。在竞赛中,还需要注意时间限制,尽量选择快速有效的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值