求定积分 c++实现
本文用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++实现相关推荐
- 用c语言编写黎曼积分计算pi,C语言实现黎曼和求定积分
本文实例为大家分享了C语言程序实现黎曼和求定积分,供大家参考,具体内容如下 通过黎曼和解定积分既是把在xy平面中函数曲线与x轴区间区域划分成多个矩形并求它们的面积之和,矩形数量越多,得出的面积越精确. ...
- 菜鸟学C语言(五)之求定积分
http://space.itpub.net/14139916/viewspace-497879 求定积分近似值 试求定积分 的近似值(积分限a,b从键盘输入). 算法分析如下: 求定 ...
- 用C语言程序实现黎曼和求定积分
通过黎曼和解定积分既是把在xy平面中函数曲线与x轴区间区域划分成多个矩形并求它们的面积之和,矩形数量越多,得出的面积越精确. #include <stdio.h> #include < ...
- 求矩形的最小值c语言,C语言复习---矩形法求定积分函数
#include #include using namespace std; int main(){ float fun(float x); float a, b; cout << &qu ...
- 迭代算法8——近似迭代法之求定积分
求定积分 [分析] 定积分 的几何意义就是求曲线f(x)与y=0,x=a,x=b所围成的曲顶梯形的面积.为了得到定积分的值,需要将连续的对象分割为容易求解的子对象,然后利用迭代法对表达式反复操作.求定 ...
- c 语言 用矩形法求定积分,如何用矩形法(梯形法)求定积分
分析: 高中的时候,我们学习过,可以通过矩形法或者矩形法来求定积分. 思路就是将积分区间划分成n等份,然后将这n等份近似看成矩形(或梯形),然后对所有的矩形(或梯形)的面积进行求和. 简单的例子: 求 ...
- 矩形法求定积分c语言流程图,矩形法求定积分其程序与程序框图的实现.doc
矩形法求定积分及其程序与程序框图的实现 ――实例探索定积分思想,切实提高课堂效果 王亮 佛冈县第一中学 数学科 [摘 要]定积分"四部曲"思想,对高中生来说不易接受,教学上用计算机 ...
- python定积分1002无标题_python 求定积分和不定积分
求f(x) = sin(x)/x 的不定积分和负无穷到正无穷的定积分 sin(x)/x 的不定积分是信号函数sig ,负无穷到正无穷的定积分为pi import math import numpy a ...
- matlab求定积分和不定积分
matlab求定积分与不定积分 创建于2018-03-21 22:42 求定积分与不定积分是一件比较繁琐的事,但是我们可以借助matlab,下面与大家分享解决方法 材料/工具 matlab 求不定积分 ...
- matlab能不能求不定积分,用MATLAB求定积分
一.符号积分 符号积分由函数int来实现.该函数的一般调用格式为: int(s):没有指定积分变量和积分阶数时,系统按findsym函数指示的默认变量对被积函数或符号表达式s求不定积分: int(s, ...
最新文章
- UML类图与类的关系
- Android SharedPreferences 详解 源码解析
- 根据数据库表gengxin实体类_Python学习第四十八天记录打call:SQLALchemy操作MySQL关系型数据库...
- 莫比乌斯反演定理证明
- markdown文本居中方法(CSDN博客编辑器文本居中方法)
- QT接收或发送二进制数据(或数据内包含0)
- App界面交互设计规范(转)
- Java安全模型与简单示例
- Linux Shell笔记4 正则表达式
- 对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会...
- linux 自动补全快捷键,day4 Linux下的快捷键和基本命令
- VMware许可证过期解决方案
- Himall商城文件帮助类IOHelper(2)
- python自动输入饥荒控制台代码
- VBA生成KML文件
- spark性能优化(二)数据倾斜问题
- 智能家居-电热水器工作原理(转载)
- html5考试总结300字,考试总结300字
- javascript错误:对象不支持此属性或方法
- sql分任意区间统计频数