用二分法求下面方程在(-10,10)的根: 2x^3 - 4x^2 + 3x - 6= 0
#define EPS 1e-5 // 误差精度 #define MAX_ITER 1000 // 最大迭代次数 // 目标函数 f(x) = 2x^3 - 4x^2 + 3x - 6 double f(double x) { return 2 * pow(x, 3) - 4 * pow(x, 2) + 3 * x - 6; } // 二分法求根 double bisection(double a, double b) { if (f(a) * f(b) >= 0) { printf("错误: f(a) 和 f(b) 符号相同,无法使用二分法。\n"); return NAN; // 返回 NaN 表示无效值 } double c; int iter = 0; while ((b - a) / 2 > EPS && iter < MAX_ITER) { c = (a + b) / 2; // 计算中点 if (fabs(f(c)) < EPS) // 判断是否满足精度要求 return c; if (f(a) * f(c) < 0) // 根在 [a, c] 区间(零点定理) b = c; else // 根在 [c, b] 区间 a = c; iter++; } return c; } int main() { double root = bisection(-10, 10); // 在区间 (-10, 10) 内求根 if (!isnan(root)) { printf("方程的根: %.5lf\n", root); } return 0; }
。
#include <stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int main(void) { float left = -10, right = 10, mid,temp=10;
while (fabs(temp) > 0.00001) { mid = (left + right) / 2; temp = ((2 * mid - 4) * mid + 3) * mid - 6; if (temp > 0) {//大于0说明太大右端点左移 right = mid; } else if((temp < 0)) { left = mid; } } printf("-10到10的根为=%f\n",mid); return 0; }
#include<stdio.h> #include<math.h> int main() { double left = -10, right = 10, mid; double temp = 10; while (fabs(temp) > 1e-5) { mid = (left + right) / 2; temp = ((2 * mid - 4) * mid + 3) * mid - 6; if (temp > 0) { right = mid; } else if (temp < 0) { left = mid; } } printf("在(-10,10)的根为:%lf", mid); return 0; }
double f(double define_range_left,double define_range_right){ double left,right,mid,x; left = define_range_left; right = define_range_right; double fx; mid = (left+right)/2; x = mid; fx = 2*pow(x,3) - 4*pow(x,2) + 3*x - 6; if (fabs(fx)<=1e-5) return x; else{ if (fx>0) return f(left,mid); else if (fx<0) return f(mid,right); } }
答案解析: 将区间划分为两部分,...
用户登录可进行刷题及查看答案
答案解析: 将区间划分为两部分,记录区间左右端点,得到中点。每次运算将中点带入方程进行运算,求得结果,进行分析:
结果 > 0:将中位数赋值给右端点
结果 < 0:将中位数赋值给左端点
以此类推…
fabs函数是一个求绝对值的函数,求出x的绝对值,和数学上的概念相同;
le-5:10^(-5) ,即0.00001
#include<stdio.h> #include<math.h> int main() { double left = -10, right = 10, mid; double temp = 10; while (fabs(temp) > 1e-5) { mid = (left + right) / 2; //((2x - 4)*x + 3) * x - 6 ==> 2x^3 - 4x^2 + 3x -6 temp = ((2 * mid - 4) * mid + 3) * mid - 6; if (temp > 0) { right = mid; } else if (temp < 0) { left = mid; } } printf("在(-10,10)的根为:%lf", mid); return 0; }
登录后提交答案