先来无事,写了一个简单的二分法求三次方程根的 C 程序,主要代码如下:
#include <stdio.h>
#include <math.h>
//函数声明
float resultOfEquation(float a,float b,float c,float d,float e,float key);
float dichotomyRoot(float a,float b,float c,float d,float e,float lowerLimit,float upperLimit);
int main(int argc, const char * argv[]) {
// insert code here...
//求方程 2*pow(x, 3) - 4*pow(x, 2) + 3*x - 6 = 0 在 x = 1.5 附近的根
//定义变量
float lowerLimit = 0.0f, upperLimit = 0.0f;
float resultFunLowerLimit = 0.0f,resultFunUpperLimit = 0.0f;
//提示输入区间
printf("请输入求根区间(用空格隔开):\n");
//判断区间是否合适
do{
resultFunLowerLimit = 0.0f,resultFunUpperLimit = 0.0f;
scanf("%f%f",&lowerLimit,&upperLimit);
resultFunLowerLimit = resultOfEquation(2,-4,3,-6,0,lowerLimit);
resultFunUpperLimit = resultOfEquation(2,-4,3,-6,0,upperLimit);
if (resultFunLowerLimit * resultFunUpperLimit > 0) {
//提示重新输入区间
printf("区间输入有误,请重新输入(用空格隔开):\n");
continue;
}
}while(resultFunLowerLimit * resultFunUpperLimit > 0);
//调用求根函数求方程根
float root = dichotomyRoot(2, -4, 3, -6, 0, lowerLimit, upperLimit);
//打印结果
printf("root = %.2f\n",root);
return 0;
}
//二分法求根
float dichotomyRoot(float a,float b,float c,float d,float e,float lowerLimit,float upperLimit){
//定义变量
float mid = (lowerLimit + upperLimit) / 2;
float resultFunLowerLimit = 0.0f;
float resultFunUpperLimit = 0.0f;
float resultFunMid = 0.0f;
//判断下限是否小于上限,否则换位
if (lowerLimit >= upperLimit) {
//若下限大于上线,进行交换
lowerLimit = lowerLimit + upperLimit;
upperLimit = lowerLimit - upperLimit;
lowerLimit = lowerLimit - upperLimit;
}
//计算函数值 //计算函数值放在此处,有重复计算?
resultFunLowerLimit = resultOfEquation(2,-4,3,-6,0,lowerLimit);
resultFunUpperLimit = resultOfEquation(2,-4,3,-6,0,upperLimit);
//循环求根
do{
mid = (lowerLimit + upperLimit) / 2;
resultFunMid = resultOfEquation(2,-4,3,-6,0,mid);
if (resultFunLowerLimit * resultFunMid < 0) {
upperLimit = mid;
resultFunUpperLimit = resultFunMid;
}else{
lowerLimit = mid;
resultFunLowerLimit = resultFunMid;
}
}while (fabs(resultFunMid)>1e-5);
return mid;
}
//计算函数值的函数
float resultOfEquation(float a,float b,float c,float d,float e,float key){
return a*pow(key, 3) + b*pow(key, 2) + c*key + d + e;
}