方程求根二分法

博客介绍了方程求根二分法,这是一种数值逼近法,在实际计算允许误差范围内,对所求根区间不断缩小以得到期望精度的数据。给出了误差计算公式,还展示了相关代码实现,包括方程表达式、二分表达式及二分次数计算等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
***方程求根二分法***

  在实际计算允许的误差范围(ε)内
  对所求根区间(a,b)不断缩小直得到所期望精度的数据
 
  属性:数值逼近法
  误差(精度):| x-x'|≤( b'-a')/2             
                       = ( b -a )/pow(2,k+1)=ε.  x为精确值,x'为第k次二分后数据
                                   a',b'为第k次二分后求根区
  MSDN:中对pow()的解析:
 
  pow(const complex<T>& x, int y);
  pow(const complex<T>& x, const T& y);
  pow(const complex<T>& x, const complex<T>& y);
  pow(const T& x, const complex<T>& y);
 
  《数值分析简明教程》-2 Editon -高等教育出版社- page 6 算法流程图
  
  代码维护:2005.6.10  DragonLord
**/

#include<iostream.h>
#include<math.h>

float Formula(float x)//方程表达式
{
   float y;
 y=x*x*x-x-1;  //范例方程 
    return y;
}

float Dimidiate(float x0,float x1)//二分表达式
{
 float k;
 k=(x0+x1)/2;
 return k;
}

int Binary(float a,float b,float e)//计算二分次数Exact_Binary
{
    int l=2;
 for(int k=0;k<100;k++)
 {
  if(pow(l,k)>=(b-a)/(2*e))break;  //|x-x'|≤(b'-a')/2=(b-a)/pow(2,k+1).
 }                                          
 return k;
}

void main()
{
 float a,b,e;                 //区间与精度
 float x,y,y0,y1;             //临时变量
 int k,n;
 
 cout<<"***方程求根二分法***"<<endl;
    cout<<"输入区间[a,b]与精度ε(绝对误差限)"<<endl;
   
 cin>>a>>b>>e;
   
 k=Binary(a,b,e);              //确定二分次数
   
 y0=Formula(a);
 y1=Formula(b);
   
 if(y0*y1<0)
 {
  for(n=0;n<=k;n++)
  {
   x=Dimidiate(a,b);
   
   cout<<"第"<<n+1<<"次二分结果:"<<x<<endl;
        
   y=Formula(x);
   
   if(y0*y>0)a=x;         //       选择领域 
   else b=x;              //确定进行下一步计算的边界
  }
     cout<<"二分次数:"<<k<<endl;
     cout<<"所求实根:"<<x<<endl;
 }
 else cout<<"限定区间内没有实根"<<endl;
}

### 关于二分法求解非线性方程根的算法 #### 基本原理 二分法的核心思想在于利用连续函数在一个闭区间上的性质,即如果函数 \( f(x) \) 在某个区间 \([a,b]\) 上满足 \( f(a) \cdot f(b) < 0 \),则可以断定此区间内至少存在一个实数根。通过反复将当前区间分为两半并选取其中含有根的一侧子区间继续操作,最终能够逐渐逼近目标根的位置。 具体步骤如下: 1. 初始设定:选定初始有根区间\([a_0, b_0]\),使得\(f(a_0)\times f(b_0)<0\)成立; 2. 计算中间点:设\(c_n=\frac{a_n+b_n}{2}\); 3. 符号判定:比较\(f(c_n)\)与零的关系以及其相对于两端点处函数值乘积的结果决定下一步如何调整新区间边界位置; - 若\(f(c_n)=0\)或者达到预设精度要求,则停止运算并将\(c_n\)视为所求数值解; - 否则依据条件更新下一个更短的新搜索范围为\[a_{n+1},b_{n+1}]=[\text{{either }} a_n,c_n \text{{ or }} c_n,b_n ]\],取决于哪一侧仍保持异号关系。 这种方法简单直观易于编程实现而且稳定性较好,在实际应用当中非常广泛适用各种类型的单变量非线性问题解决过程之中[^1]。 下面给出一段基于Python语言描述的具体代码实例用于演示上述理论的实际运用情况: ```python def binary_search_root(f, a, b, tol=1e-7): """ 使用二分法寻找函数f在[a,b]内的一个实根 参数: f (function): 待求根的目标函数. a (float): 已知含根区间的左端点. b (float): 已知含根区间的右端点. tol (float): 容差,默认值为1e-7. 返回: float: 找到的一个近似根。 抛出异常: ValueError: 如果输入区间不合法(比如两端点函数值同号). """ fa = f(a) fb = f(b) if fa * fb >= 0: raise ValueError("The given interval [{}, {}] does not bracket a root".format(a, b)) while abs(b-a)/2 > tol: midpoint = (a + b) / 2 fm = f(midpoint) if fm == 0 or abs(fm) < tol: return midpoint elif fa*fm<0 : b = midpoint fb=fm else: a =midpoint fa=fm return (a+b)/2 # 测试例子 if __name__ == "__main__": from math import sin def example_function(x): return x ** 2 - 4*sin(x)-5 result =binary_search_root(example_function,-8 ,9 ) print("Approximate Root:",result) ``` 以上程序定义了一个通用版本的二分查找算法`binary_search_root`,它接受四个参数分别是待处理的目标函数对象、两个代表可能包含唯一真实解答所在区域边界的数值还有可选的小误差界限默认设置成很小的数量级以便控制精确程度。当调用者提供适当形式化的数学表达式之后就可以轻松获得相应范围内符合条件的最佳估计量了[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值