对于一个非线性方程f(x)=0求改方程的根,我们的思路可以这么想:

  1.根的存在性。若该方程没有根,何必徒劳想法设法去求它的解呢?对于一个方程,我们怎么去找他的根,有连续函数零点定理可知:若有f(a)f(b)<0,则在(a, b)区间有解,究竟是一个还是多少个,还是要看具体的方程。

  2.根的分布。这个方程的根分布在哪个区间,我们在程序实现的时候就可以一一搜索,用什么方法呢?我们可以采用一个不怎么高效的方法,等步长扫描法,在扫描的期间如果出现f(x1)(fy1)<0,则说明(x1, y1)区间有根。

    等步长扫描法:

      设定h>0为给定的步长,基础区间为(a, b),取x0=a,x1=x0+h,若f(x0)(x1)<0,则扫描成功,有根区间锁定在(x0, x1),否则,有x0=x1, x1=x0+h,然后再进行扫描,直到x1>b为止,但这不等于该方程没有根,因为你的步长如果很大,误差就大,很容易错过了有根的区间,所以当然建议采用尽量小的步长扫描。

#include <iostream>
#include <list>
using namespace std; /*
Value类:
用来存储一个区间的左边界值和右边界值
*/
class Value {
private:
double leftBound;
double rightBound;
public:
double getLeftBound() {
return leftBound;
}
void setLeftBound(double leftBound) {
this->leftBound = leftBound;
}
double getRightBound() {
return rightBound;
}
void setRightBound(double rightBound) {
this->rightBound = rightBound;
}
}; /*
Array类:
利用list类库作为模式定义一个存储容器来存储结果
*/
typedef list<Value> Array; /*
f(x)=0这个函数的逻辑实现
*/
double f(double x) {
return x*x-*x+;
} /*
等步长扫描法实现:
SameStepScan方法:
参数:
left:左边界
right:右边界
stepLength:步长值
array: 结果集
*/
void SameStepScan(double left, double right, double stepLength, Array *array) {
double x0 = left;
double x1 = x0 + stepLength;
while(x1 <= right) {
if(f(x0)*f(x1)<) {
Value value;
value.setLeftBound(x0);
value.setRightBound (x1);
(*array).push_back(value);
}
x0 = x1;
x1 = x0 + stepLength;
}
} /*
main方法测试
*/
int main() {
Array *array = new Array();
SameStepScan(, , 0.3, array);
for(Array::iterator it = (*array).begin(); it != (*array).end(); it++) {
cout<<"("<<(*it).getLeftBound()<<", "<<(*it).getRightBound()<<")"<<endl;
}
return ;
}

  3.根的精确化。我们可以通过上面的方法得到一个区间,相当于已知了一个根的近似值,最后我们最迫切的就是让这个近似值尽量可能的靠近真值。我们通过等步长扫描法找到区间,然后通过二分法在区间中找到近似值。

    二分法:二分法的原理也是基于连续函数的零点定理,设定f(x)=0在(a, b)区间有唯一的实根,令a1=a, b1=b, x=(a1+b1)/2, 如果f(a)f(x)<0,则新的区间为[a1, x],否则为[x, b1],然后再重复上面的步骤,最后a1-b1足够小的时候,x就是为近似值了。

/*
二分法实现:
BinaryDivide:
left:左边界
right:右边界
accuracy:精度控制量
value:近似值
*/
void BinaryDivide(double left, double right, double accuracy, double &value) {
double a1 = left;
double b1 = right;
double x = (a1+b1)/;
while(b1-a1 > accuracy) {
if(f(a1)*f(x) < ) {
b1 = x;
x = (a1+b1)/;
} else {
a1 = x;
x = (a1+b1)/;
}
}
value = x;
} /*
main方法测试
*/
int main() {
double value;
Array *array = new Array();
SameStepScan(, , 0.3, array);
for(Array::iterator it = (*array).begin(); it != (*array).end(); it++) {
cout<<"("<<(*it).getLeftBound()<<", "<<(*it).getRightBound()<<")"<<endl;
BinaryDivide((*it).getLeftBound(), (*it).getRightBound(), 0.00001, value);
cout<<"value : "<<value<<endl;
}
return ;
}

二分法-C++的更多相关文章

  1. C语言两种查找方式(分块查找,二分法)

    二分法(必须要保证数据是有序排列的):   分块查找(数据有如下特点:块间有序,块内无序):    

  2. poj3122-Pie(二分法+贪心思想)

    一,题意: 有f+1个人(包括自己),n块披萨pie,给你每块pie的半径,要你公平的把尽可能多的pie分给每一个人 而且每个人得到的pie来自一个pie,不能拼凑,多余的边角丢掉.二,思路: 1,输 ...

  3. 二分法&三分法

    ural History Exam    二分 #include <iostream> #include <cstdlib> using namespace std; //二分 ...

  4. [No000087]Linq排序,SortedList排序,二分法排序性能比较

    using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...

  5. [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)

    冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...

  6. iOS常见算法(二分法 冒泡 选择 快排)

    二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number)  { int start = 0; int end = l ...

  7. java简单的二分法排序

    二分法排序的思路:数据元素要按顺序排列,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于当前位置值,则在数列的前半段中查找:若 x 大于当前位置值则在数列的后 ...

  8. 使用二分法查找mobile文件中区号归属地

    #!/usr/bin/env python #coding:utf-8 ''' Created on 2015年12月8日 @author: DL @Description: 使用二分法查找mobil ...

  9. Atitit 迭代法  “二分法”和“牛顿迭代法 attilax总结

    Atitit 迭代法  "二分法"和"牛顿迭代法 attilax总结 1.1. ."二分法"和"牛顿迭代法"属于近似迭代法1 1. ...

  10. 02python算法-二分法简介

    老规矩: 什么是二分法: 其实是一个数学领域的词,但是在计算机领域也有广泛的使用. 为什么需要二分法? 当穷举算法性能让你崩溃时. 二分法怎么用呢? 让我们先玩一个游戏先,我心里想一个100以内的整数 ...

随机推荐

  1. ABP领域层——仓储(Repositories)

    ABP领域层——仓储(Repositories) 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是 ...

  2. Android中的“再按一次返回键退出程序”实现[转]

    用户退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友好,用户还得移动手指去按dial ...

  3. 霍夫曼(最优二叉树)和Java达到

    一.定义 一些定义: 节点之间的路径长度:在从节点树中的一个节点也经历分公司,这构成的两个节点之间的路径分支的数目后这就是所谓的路径长度 的路径长度:从树的根节点到树中每一结点的路径长度之和. 在结点 ...

  4. linux_shell_拆分文件_多进程脚本

    [需求场景]:一个10000w行的文件处理  ,多进程处理  比如启动100个进程同时处理. [方法]:拆分文件(split) ,制作shell脚本  执行后台进程 [demo]: 假设处理程序为   ...

  5. Oracle免费的便捷Web应用开发框架

    Oracle免费的便捷Web应用开发框架 APEX 总体来说,APEX是我见过最便捷最高效的开发框架,用起来比PHP还舒服.上手简单,学习成本极低,曾经有个做行政的小女生,在我指导下两天就可以开发出简 ...

  6. JS Tree

    jQuery插件实例七:一棵Tree的生成史 在需要表示级联.层级的关系中,Tree作为最直观的表达方式常出现在组织架构.权限选择等层级关系中.典型的表现形试类似于: 一颗树的生成常常包括三个部分:1 ...

  7. C++11 virtual函数学习笔记

    #include<iostream> #include<string> using namespace std; class Base { public: Base(){} ~ ...

  8. bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...

  9. 使用jquery实现放大镜效果

    原文:使用jquery实现放大镜效果 实现原理 首先,我们讲解一下放大镜效果的实现方式: 方法一:准备一张高像素的大图,当鼠标放到原图上,加载显示大图的对应位置. 方法二:对原图片进行放大,也就是调整 ...

  10. Cocos2d-x 3.0final 终结者系列教程12-Vector&amp;map&amp;value

    北京时间昨天下午,温40度.中午12:16我来到了篮球场点.思维1分钟决定开站 转球: 我和另一个3队友半开始, 我手中的球的那一刻我突然火爆球不稳,突然问,淡淡的味道橡胶和烧烤的味道混合. 个腾空跳 ...