很久之前了,群上有人问有没有用C#写的积分函数,因为我自己以前做过一个积分计算器,就跟他说搜索一下Romberg积分法吧,但是后来他说网上写的都是用C++写的方法,没有C#的,问我有没有,但是我之前是在家里做的,学校里没有副本,可惜。
今天翻一下邮箱,发现居然是我忘记贴标签,导致当时没有找到,感觉有点对不起那位兄弟,在此就拿出来分享一下吧。
网上翻过很多代码都是照搬算法说明来迭代的,我却把那个公式代进去,化简到只剩下四项,将空间要求降低了,如果还有什么能改进的地方请各位多多指教!以下是代码片断:

Code
/// <summary>
/// Romberg 龙贝格算法
/// </summary>
/// <param name="f">被积表达式函数</param>
/// <param name="a">积分下限</param>
/// <param name="b">积分上限</param>
/// <param name="e">精度</param>
/// <param name="maxSteps">最大迭代次数</param>
/// <returns></returns>
public static double Romberg( Func<double, double> f, double a, double b, double e, int maxSteps ) {
double M = 2835.0;
double A = 217.0;
double B = 2048.0;
double C = 352.0;
double D = 218.0;
double T1n = (b - a) * (f(b) + f(a)) / 2;
double H4n = H(f, a, b, 4);
double H2n = H(f, a, b, 2);
double H1n = H(f, a, b, 1);
double R1 = (A * T1n + B * H4n + C * H2n + D * H1n) / M;
double R2 = 0.0;
for (int steps = 0; steps < maxSteps; ++steps) {
T1n = (T1n + H1n) / 2;
H1n = H2n;
H2n = H4n;
H4n = H(f, a, b, 8 << steps);
R2 = (A * T1n + B * H4n + C * H2n + D * H1n) / M;
if (Math.Abs(R2 - R1) <= e) {
return R2;
}
else {
R1 = R2;
}
}
return R2;
}
private static double H( Func<double, double> f, double a, double b, int n ) {
double h = (b - a) / n;
double sum = 0.0;
for (int k = 0; k < n; ++k) {
sum += f(a + (k + 0.5) * h);
}
return h * sum;
}
那个 private static double H 方法其实就是最简单梯形法,也许可以将它写成Romberg方法里面的匿名方法,但是因为我的类中Romberg方法还有很多重载,所以就写成这样,也许C# 4.0 出来后有可选变量的时候就可以这样做了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述