本文用C++实现了求一个简单函数的定积分

(目前仅支持一元四则混合运算)

说明:

求定积分部分采用的是辛普森积分法

表达式匹配部分采用的是表达式二叉树计算

code:

/*
Date:2018.12.2
Author:DeepWave
*/
#include<bits/stdc++.h>
using namespace std;
#define Var map<string,double>
const double eps = 1e-12;  //精度设置
Var vars;   //变量预定义
string str;  //表达式
string variable;  //变量名
double a, b;  //积分上下限class Expression;
class Constant;
class UnkownNumber;
class Operation;
class Integral;
Expression *expressionTree(string s, int start, int len);
void Initialization();class Expression
{
public:virtual double Evaluate(Var v){return 0;}
};
Expression *EXP;  //表达式树/*
常数类
*/
class Constant : public Expression
{
public:double value;Constant(double value){this->value = value;}double Evaluate(Var vars){return value;}
};/*
操作符类
由传入的左右子表达式计算
*/
class Operation: public Expression
{
public:char op;Expression *Left, *Right;Operation(Expression *Left, Expression *Right, char op){this->Left = Left;this->Right = Right;this->op = op;}double Evaluate(Var v){double x = Left->Evaluate(v);double y = Right->Evaluate(v);switch(op){case'+':return x + y;case'-':return x - y;case'*':return x * y;case'/':return x / y;}return 0;}
};/*
未知数类
将表达式中的未知数进行转换
*/
class UnkownNumber: public Expression
{
public:string name;UnkownNumber(string name){this->name = name;}double Evaluate(Var v){return vars[name];}
};/*
由字符串转为表达式树
*/
Expression *expressionTree(string s, int start, int len)
{bool hasAlpha = false, hasOperator = false;int bracket = 0, PS = -1, MD = -1;while(start <= len && s[start] == '(' && s[len] == ')')start++, len--;if(start > len)return new Constant(0);for(int i = start; i <= len; i++){if(s[i] != '.' && !isdigit(s[i])){if(isalpha(s[i]))hasAlpha = true;else{hasOperator = true;switch(s[i]){case '+':case '-':if(!bracket) PS = i;break;case '*':case '/':if(!bracket) MD = i;break;case '(':bracket++;break;case ')':bracket--;break;}}}}if(hasAlpha == false && hasOperator == false)return new Constant(stod(s.substr(start, len - start + 1)));else if(hasOperator == false)return new UnkownNumber(s.substr(start, len - start + 1));else{int mid = PS == -1 ? MD : PS;return new Operation(expressionTree(s, start, mid - 1), expressionTree(s, mid + 1, len), s[mid]);}return 0;
}/*
积分类
*/
class Integral
{
public:double a, b;Integral(double a, double b){this->a = a;this->b = b;}double Function(double x){vars[variable]=x;return EXP->Evaluate(vars);}double simpson(double a, double b){double c = a + (b - a) / 2;return (Function(a) + 4 * Function(c) + Function(b)) * (b - a) / 6.0;}double calculate(double a, double b, double Eps){double c = a + (b - a) / 2;double mid = simpson(a, b);double Left = simpson(a, c);double Right = simpson(c, b);if(fabs(Left + Right - mid) <= 15.0 * eps)return Left + Right + (Left + Right - mid) / 15.0;return calculate(a, c, Eps / 2.0) + calculate(c, b, Eps / 2.0);}double Evaluate(double Eps){double up, down;down = this->a;up = this->b;return calculate(down, up, Eps);}
};void Initialization()  //可预设常量值
{vars["e"] = 2.7182818284;vars["pi"] = acos(-1);
}int main()
{Initialization();cout << "Please enter an expression that requires integration.(linear equation with one unknown)" << endl;cin >> str;EXP = expressionTree(str, 0, str.length() - 1);cout << "Please enter the upper and lower limit of the integral." << endl;cin >> a >> b;cout << "Please input variable name." << endl;cin >> variable;Integral I (a, b);printf("%.5f\n", I.Evaluate(eps));return 0;
}

求定积分 c++实现相关推荐

  1. 用c语言编写黎曼积分计算pi,C语言实现黎曼和求定积分

    本文实例为大家分享了C语言程序实现黎曼和求定积分,供大家参考,具体内容如下 通过黎曼和解定积分既是把在xy平面中函数曲线与x轴区间区域划分成多个矩形并求它们的面积之和,矩形数量越多,得出的面积越精确. ...

  2. 菜鸟学C语言(五)之求定积分

    http://space.itpub.net/14139916/viewspace-497879 求定积分近似值     试求定积分 的近似值(积分限a,b从键盘输入). 算法分析如下:     求定 ...

  3. 用C语言程序实现黎曼和求定积分

    通过黎曼和解定积分既是把在xy平面中函数曲线与x轴区间区域划分成多个矩形并求它们的面积之和,矩形数量越多,得出的面积越精确. #include <stdio.h> #include < ...

  4. 求矩形的最小值c语言,C语言复习---矩形法求定积分函数

    #include #include using namespace std; int main(){ float fun(float x); float a, b; cout << &qu ...

  5. 迭代算法8——近似迭代法之求定积分

    求定积分 [分析] 定积分 的几何意义就是求曲线f(x)与y=0,x=a,x=b所围成的曲顶梯形的面积.为了得到定积分的值,需要将连续的对象分割为容易求解的子对象,然后利用迭代法对表达式反复操作.求定 ...

  6. c 语言 用矩形法求定积分,如何用矩形法(梯形法)求定积分

    分析: 高中的时候,我们学习过,可以通过矩形法或者矩形法来求定积分. 思路就是将积分区间划分成n等份,然后将这n等份近似看成矩形(或梯形),然后对所有的矩形(或梯形)的面积进行求和. 简单的例子: 求 ...

  7. 矩形法求定积分c语言流程图,矩形法求定积分其程序与程序框图的实现.doc

    矩形法求定积分及其程序与程序框图的实现 ――实例探索定积分思想,切实提高课堂效果 王亮 佛冈县第一中学 数学科 [摘 要]定积分"四部曲"思想,对高中生来说不易接受,教学上用计算机 ...

  8. python定积分1002无标题_python 求定积分和不定积分

    求f(x) = sin(x)/x 的不定积分和负无穷到正无穷的定积分 sin(x)/x 的不定积分是信号函数sig ,负无穷到正无穷的定积分为pi import math import numpy a ...

  9. matlab求定积分和不定积分

    matlab求定积分与不定积分 创建于2018-03-21 22:42 求定积分与不定积分是一件比较繁琐的事,但是我们可以借助matlab,下面与大家分享解决方法 材料/工具 matlab 求不定积分 ...

  10. matlab能不能求不定积分,用MATLAB求定积分

    一.符号积分 符号积分由函数int来实现.该函数的一般调用格式为: int(s):没有指定积分变量和积分阶数时,系统按findsym函数指示的默认变量对被积函数或符号表达式s求不定积分: int(s, ...

最新文章

  1. UML类图与类的关系
  2. Android SharedPreferences 详解 源码解析
  3. 根据数据库表gengxin实体类_Python学习第四十八天记录打call:SQLALchemy操作MySQL关系型数据库...
  4. 莫比乌斯反演定理证明
  5. markdown文本居中方法(CSDN博客编辑器文本居中方法)
  6. QT接收或发送二进制数据(或数据内包含0)
  7. App界面交互设计规范(转)
  8. Java安全模型与简单示例
  9. Linux Shell笔记4 正则表达式
  10. 对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会...
  11. linux 自动补全快捷键,day4 Linux下的快捷键和基本命令
  12. VMware许可证过期解决方案
  13. Himall商城文件帮助类IOHelper(2)
  14. python自动输入饥荒控制台代码
  15. VBA生成KML文件
  16. spark性能优化(二)数据倾斜问题
  17. 智能家居-电热水器工作原理(转载)
  18. html5考试总结300字,考试总结300字
  19. javascript错误:对象不支持此属性或方法
  20. sql分任意区间统计频数

热门文章

  1. 云小课|3种常用Git工作流推荐
  2. HTML写一个简单网页
  3. 海康SDK接口调用的主要流程
  4. 算法设计与分析第一章习题解答与学习指导(第2版)屈婉婷 刘田 张立昂 王捍贫编著 清华大学出版社
  5. bat代码雨代码流星_怎么制作无限弹窗效果? 限弹窗代码bat文件分享
  6. 软考数据库系统工程师复习资料(完全版)
  7. 分享ssd固态硬盘分区装系统全过程!
  8. 大一c语言常见编程题,自己整理的C语言常见编程题
  9. OpenCV-camShift 算法
  10. 2018/03/01