c++解一元二次方程<二分>
//写代码能缓解焦虑症
c++解一元二次多项式:
数据输入:
1.数值解的精度
2.单调求解区间:键入区间的左、右端点
3.非线性方程:用c++函数实现,把f(x)数学关系式写在c++函数中
数据存储:
1.单调求解区间:const double eps=0.00001;
2.单调求解区间:定义变量double L,R;分别表示区间的左右端点;
3.非线性方程:定义函数double fx(double x);
4.定义计算过程中所需的其他变量,如区间中点,各点函数值等.
数据处理:
求解非线性方法的数值解法。
数据输出:
二分法求解:
(1).迭代法计算算法;
计算单调求解区间[L,R]的中点:M=(L+R)/2;
(2)判断M是否满足收敛条件,即是否是方程的解;
若是,则保存该解(x=M),算法退出
否则,判断解在左区间[L,M)还是在右区间(L,M]:
解在左区间的判断条件:f(M)*f(L)>0,同号
解在右区间的判断条件:f(M)*f(L)<0.异号
丢弃左区间L←M,端点移动到M点
丢弃左区间L→M,端点移动到M点
(3).返回,进行下一轮迭代计算
(4).数据输出
方程的解x及函数值f(x).函数值用于检验方程是否等于零(包括误差)
代码:
#include<iostream> #include<cmath> using namespace std; //方程 double fx(double x) { return x*x - x - 2; } void main() { //定义 const double eps = 1.e-5;//精度 double L, M, R;//区间 中点 double fL, fM;//区间左端点和中点的函数值 int Count = 0;//迭代次数 cout << "单调区间左端点"; cin >> L; cout << "单调区间右端点"; cin >> R; cout << "f(L)=" << fx(L) << ",f(R)=" << fx(R) << endl; if (fx(L)*fx(R)>0)//有解区间;函数两端异号 { cout << "非有解区间:\n"; system("pause"); } while (fabs(R - L)>eps)//收敛性判断:精度控制 { cout << ++Count << "次"; M = (L + R) / 2; fL = fx(L); fM = fx(M); //解在左区间 if (fL*fM<0) { R = M;//右端点移位 } else if (fL*fM>0) { L = M;//左端点移位 } else { break; } cout << L << "," << R << endl; } cout << "方程的解:" << "x=" << M << "\n函数值:" << fx(M) << endl; getchar(); }
浙公网安备 33010602011771号