开源Math.NET基础数学类库使用(08)C#进行数值积分
原文:【原创】开源Math.NET基础数学类库使用(08)C#进行数值积分
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html
开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html
前言
在数值计算的需求中,数值积分也是比较常见的一个。我们也知道像Matlab,Mathematics等软件的积分求解功能非常高大上,不仅能求解定积分,还能求解不定积分,甚至多重积分等等。而Math.NET这个组件没有如此高级的功能,目前也只提供了比较件的闭区间上的定积分求解功能。今天就一起来看看,因为不定积分涉及到符号计算,因此其背后的原理和实现要复杂得多。就连Matlab这种软件暂时也不支持混编编程求解符号计算相关的功能。
如果本文资源或者显示有问题,请参考 本文原文地址:http://www.cnblogs.com/asxinyu/p/4301017.html
1.定积分
很多人可能已经淡忘了定积分的概念,当然需要用到的朋友看到这里,也基本不用看本段的内容,比较简单,高等数学已经是10多年前学过的东西了,虽然以前很精通,现在也只能凭印象理解和网络来对这个概念稍微进行整理,可能有些不完整或小错误,还请谅解。
数学定义:如果函数f(x)在区间[a,b]上连续,用分点xi将区间[a,b]分为n 个小区间,在每个小区间[xi-1,xi]上任取一点ri(i=1,2,3„,n) ,作和式f(r1)+...+f(rn) ,当n趋于无穷大时,上述和式无限趋近于某个常数A,这个常数叫做y=f(x) 在区间上的定积分. 记作/ab f(x) dx 即 /ab f(x) dx =limn>00 [f(r1)+...+f(rn)], 这里,a 与 b叫做积分下限与积分上限,区间[a,b] 叫做积分区间,函数f(x) 叫做被积函数,x 叫做积分变量,f(x)dx 叫做被积式。
几何定义:可以理解为在 Oxy坐标平面上,由曲线y=f(x)与直线x=a,x=b以及x轴围成的曲边梯形的面积值(一种确定的实数值)。
详细的可以参考以下链接:
定积分的计算公式和性质:http://www.shuxuecheng.com/gaosuzk/content/lljx/wzja/5/5-2.htm
2.Math.NET关于定积分的实现
Math.NET中对定积分的实现都在MathNet.Numerics.Integration命名空间以及Integrate.cs中,Integrate静态类其实是对Integration命名空间下几个近似积分方法的实现。Math.NET定积分的近似求解主要是用到了“梯形法则”,详细的内容可以参考以下:链接,其原理非常简单。这里我们只介绍经常用到的Integrate静态类的实现,很简单,其他内部实现过程可以查源码:
using System;
using MathNet.Numerics.Integration; namespace MathNet.Numerics
{
/// <summary>
/// 数值积分类
/// </summary>
public static class Integrate
{
/// <summary>
/// 近似解析光滑函数在闭区间上的定积分
/// </summary>
/// <param name="f">The analytic smooth function to integrate.</param>
/// <param name="intervalBegin">Where the interval starts, inclusive and finite.</param>
/// <param name="intervalEnd">Where the interval stops, inclusive and finite.</param>
/// <param name="targetAbsoluteError">The expected relative accuracy of the approximation.</param>
/// <returns>Approximation of the finite integral in the given interval.</returns>
public static double OnClosedInterval(Func<double, double> f, double intervalBegin, double intervalEnd, double targetAbsoluteError)
{
return DoubleExponentialTransformation.Integrate(f, intervalBegin, intervalEnd, targetAbsoluteError);
} /// <summary>
/// 近似解析光滑函数在闭区间上的定积分
/// </summary>
/// <param name="f">The analytic smooth function to integrate.</param>
/// <param name="intervalBegin">Where the interval starts, inclusive and finite.</param>
/// <param name="intervalEnd">Where the interval stops, inclusive and finite.</param>
/// <returns>Approximation of the finite integral in the given interval.</returns>
public static double OnClosedInterval(Func<double, double> f, double intervalBegin, double intervalEnd)
{
return DoubleExponentialTransformation.Integrate(f, intervalBegin, intervalEnd, 1e-);
}
}
}
下面的例子就是直接调用该类进行的。
3.C#使用Math.NET求解定积分的例子
使用比较简单,直接看源码:
// 1. Integrate x*x on interval [0, 10]
Console.WriteLine(@"1.函数 x*x 在闭区间 [0, 10] 上的积分");
var result = Integrate.OnClosedInterval(x => x * x, , );
Console.WriteLine(result);
Console.WriteLine(); // 2. Integrate 1/(x^3 + 1) on interval [0, 1]
Console.WriteLine(@"2.函数 1/(x^3 + 1) 在闭区间 [0, 1] 上的积分");
result = Integrate.OnClosedInterval(x => / (Math.Pow(x, ) + ), , );
Console.WriteLine(result);
Console.WriteLine(); // 3. Integrate f(x) = exp(-x/5) (2 + sin(2 * x)) on [0, 10]
Console.WriteLine(@"3.函数 f(x) = exp(-x/5) (2 + sin(2 * x)) 在 [0, 10]上的积分");
result = Integrate.OnClosedInterval(x => Math.Exp(-x / ) * ( + Math.Sin( * x)), , );
Console.WriteLine(result);
Console.WriteLine(); // 4. Integrate target function with absolute error = 1E-4
Console.WriteLine(@"4. 对目标函数进行积分,绝对误差= 1E-4 ,区间 [0, 10]");
Console.WriteLine(@"public static double TargetFunctionA(double x)
{
return Math.Exp(-x / 5) * (2 + Math.Sin(2 * x));
}");
result = Integrate.OnClosedInterval(TargetFunctionA, , , 1e-);
Console.WriteLine(result);
Console.WriteLine();
参数主要有3个:函数,积分下限,积分上限,其他的就是附带一个绝对误差了,看看运行结果:
.函数 x*x 在闭区间 [, ] 上的积分
333.333333333332 .函数 /(x^ + ) 在闭区间 [, ] 上的积分
0.835648848264702 .函数 f(x) = exp(-x/) ( + sin( * x)) 在 [, ]上的积分
10.4950494839272 . 对目标函数进行积分,绝对误差= 1E- ,区间 [, ]
public static double TargetFunctionA(double x)
{
return Math.Exp(-x / ) * ( + Math.Sin( * x));
}
10.4950494839276
4.资源
源码下载:http://www.cnblogs.com/asxinyu/p/4264638.html
如果本文资源或者显示有问题,请参考 本文原文地址:http://www.cnblogs.com/asxinyu/p/4301017.html
开源Math.NET基础数学类库使用(08)C#进行数值积分的更多相关文章
- 【原创】开源Math.NET基础数学类库使用(08)C#进行数值积分
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【目录】开源Math.NET基础数学类库使用总目录
本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.开源Math.NET数学组件文章 1.开源Math.NET基础数学类库使用(01)综合介绍 2.开源Math.NET ...
- 【原创】开源Math.NET基础数学类库使用(01)综合介绍
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【原创】开源Math.NET基础数学类库使用(02)矩阵向量计算
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【原创】开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【原创】开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【原创】开源Math.NET基础数学类库使用(06)直接求解线性方程组
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【原创】开源Math.NET基础数学类库使用(07)常用的数学物理常数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 1.前 ...
随机推荐
- Java对象序列化/反序列化的注意事项
Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...
- HDU 4869 Turn the pokers(推理)
HDU 4869 Turn the pokers 题目链接 题意:给定n个翻转扑克方式,每次方式相应能够选择当中xi张进行翻转.一共同拥有m张牌.问最后翻转之后的情况数 思路:对于每一些翻转,假设能确 ...
- Django写的投票系统2(转)
在上一篇中 django实例:创建你的第一个应用投票系统(一) 已经介绍基本的功能,并已经启动服务了.这一节介绍数据库相关的东东. 首页打开mysite/settings.py配置文件, 设置数据库打 ...
- coding 除了托管外,还能进行团队协作.
coding 除了托管外,还能进行团队协作. oschina 也是非常不错的.
- hdu5046(重复覆盖+二分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:要在n个城市里建造不超过k个机场覆盖所有城市,问机场城市之间最大距离最小为多少. 分析:二 ...
- c++ cin>>详解
参考地址:http://www.cnblogs.com/A-Song/archive/2012/01/29/2331204.html 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当 ...
- 网络安全之IP伪造
眼下非常多站点的涉及存在一些安全漏洞,黑客easy使用ip伪造.session劫持.xss攻击.session注入等手段危害站点安全.在纪录片<互联网之子>(建议搞IT的都要看下)中.亚伦 ...
- 设计模式六大原则(4):接口隔离原则(Interface Segregation Principle)
接口隔离原则: 使用多个专门的接口比使用单一的总接口要好. 一个类对另外一个类的依赖性应当是建立在最小的接口上的. 一个接口代表一个角色,不应当将不同的角色都交给一个接口.没有关系的接口合并在一起,形 ...
- JUnit4.8.2来源分析-6.1 排序和过滤
Runner.sort.Request.sortWith和Sorter.apply yqj2065很快,他们搞死. Sorter.apply().Request.sortWith()和Sortable ...
- sql server 常用语法
--1 创建数据库 DROP DATABASE mydb1 CREATE DATABASE mydb1 ON ( NAME ='mydb1',FILENAME='D:\mydb1.mdf') LOG ...