第5章非线性方程与方程组的求解
〖1〗5.1求非线性方程实根的对分法
【功能】
用对分法搜索方程f(x)=0在区间\[a,b\]内的实根。
【方法说明】
从区间左端点x=a开始,以h为步长,逐步往后进行搜索。
对于在搜索过程中遇到的每一个子区间\[xk,xk+1\](其中xk+1=xk+h)做如下处理:
若f(xk)=0,则xk为一个实根,且从xk+h/2开始往后再搜索;
若f(xk+1)=0,则xk+1为一个实根,且从xk+1+h/2开始往后再搜索;
若f(xk)f(xk+1)>0,则说明在当前子区间内无实根或h选得过大,放弃本子区间,从xk+1开始往后再搜索;
若f(xk)f(xk+1)<0,则说明在当前子区间内有实根,此时利用对分法,直到求得一个实根为止,然后从xk+1开始往后再搜索。
上述过程一直进行到区间右端点b为止。
特别要注意,在根的搜索过程中,要合理选择步长,尽量避免根的丢失。
【函数语句与形参说明】
int dhrt(double a, double b, double h, double eps, double x\[\],
int m, double (f)(double))形参与函数类型参 数 意 义doublea求根区间的左端点doubleb求根区间的右端点doubleh搜索求根时采用的步长doubleeps控制精度要求doublex\[m\]返回在区间\[a,b\]内的实根。实根个数由函数值返回〖1〗〖2〗常用算法程序集(C++描述)(第6版)〖1〗第5章非线性方程与方程组的求解续表
形参与函数类型参 数 意 义intm在区间\[a,b\]内实根个数的预估值double(f)()指向计算方程左端函数f(x)值的函数名(由用户自编)intdhrt()函数返回在区间\[a,b\]内实际搜索到的实根个数。若此值等于m,则有可能没有搜索完计算方程左端函数f(x)值的函数形式为doublef(double x)
{ doublez;
z=f(x)的表达式;
return(z);
}【函数程序】
//方程求根对分法.cpp
#include
#include
using namespace std;
//a求根区间的左端点
//b求根区间的右端点
//h搜索求根所采用的步长
//eps控制精度要求
//x\[m\]存放返回的实根。实根个数由函数值返回
//m实根个数的预估值
//f方程左端函数f(x)的函数名
//函数返回搜索到的实根个数。若此值等于m,则可能没有搜索完
int dhrt(double a, double b, double h, double eps, double x\[\],
int m, double (f)(double))
{