python – 如何改进这种自适应梯形法则?

python – 如何改进这种自适应梯形法则?,第1张

概述我尝试过纽曼编写的计算物理练习,并编写了以下代码用于自适应梯形法则.当每张幻灯片的误差估计值大于允许值时,它将该部分分成两半.我只是想知道我还能做些什么才能使算法更有效率. xm=[]def trap_adapt(f,a,b,epsilon=1.0e-8): def step(x1,x2,f1,f2): xm = (x1+x2)/2.0 fm = 我尝试过纽曼编写的计算物理练习,并编写了以下代码用于自适应梯形法则.当每张幻灯片的误差估计值大于允许值时,它将该部分分成两半.我只是想知道我还能做些什么才能使算法更有效率.

xm=[]def trap_adapt(f,a,b,epsilon=1.0e-8):        def step(x1,x2,f1,f2):        xm = (x1+x2)/2.0        fm = f(xm)        h1 = x2-x1        h2 = h1/2.0        I1 = (f1+f2)*h1/2.0        I2 = (f1+2*fm+f2)*h2/2.0        error = abs((I2-I1)/3.0) # leading term in the error Expression        if error <= h2*delta:            points.append(xm) # add the points to the List to check if it is really using more points for more rAPId-varying regions            return h2/3*(f1 + 4*fm + f2)        else:            return step(x1,xm,fm)+step(xm,fm,f2)     delta = epsilon/(b-a)    fa,fb = f(a),f(b)      return step(a,fa,fb)

此外,我使用了一些简单的公式来比较这与Romberg积分,并发现在相同的精度下,这种自适应方法使用更多的点来计算积分.

是因为它固有的局限性吗?使用这种自适应算法而不是Romberg方法的任何优点?有什么方法可以让它更快更准确?

解决方法 您的代码正在精炼以满足每个子区间的容错.它还使用低阶集成规则.这两方面的改进可以显着减少功能评估的数量.

不是分别考虑每个子区间中的错误,而是更高级的代码计算所有子区间的总误差并进行细化,直到总误差低于期望的阈值.选择子区间以根据它们对总误差的贡献进行细化,首先细化较大的误差.通常,优先级队列用于快速选择子区间以进行细化.

高阶集成规则可以精确地集成更复杂的函数.例如,您的代码基于Simpson的规则,该规则对于最大为3的多项式是精确的.更高级的代码可能会使用对于更高程度的多项式(例如10-15)的精确规则.

从实际的角度来看,最简单的方法是使用实​​现上述想法的固定例程,例如scipy.integrate.quad.除非您对要整合的内容有特别的了解,否则您不太可能做得更好.

Romberg集成需要在等间隔点进行评估.如果您可以在任何点评估函数,那么其他方法通常对于“平滑”(类多项式)函数更准确.如果你的功能在任何地方都不平滑,那么自适应代码会做得更好,因为它可以专注于减少非平滑区域中的错误.

总结

以上是内存溢出为你收集整理的python – 如何改进这种自适应梯形法则?全部内容,希望文章能够帮你解决python – 如何改进这种自适应梯形法则?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1197243.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存