- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一个 RKF4(5) 积分器,但我无法确定我的代码是否正常工作并且我不理解本地截断错误,或者我的代码是否无法正常工作。
对于代码块的大小,我深表歉意,但在这种情况下,最小可重现示例相当大。
import numpy as np
def RKF45(state, derivative_function, h):
"""
Calculate the next state with the 4th-order calculation, along with a 5th-order error
check.
Inputs:
state: the current value of the function, float
derivative_function: A function which takes a state (given as a float)
and returns the derivative of a function at that point
h: step size, float
"""
k1 = h * derivative_function(state)
k2 = h * derivative_function(state + (k1 / 4))
k3 = h * derivative_function(state + (k1 * (3/32)) + (k2 * (9/32)))
k4 = h * derivative_function(state + (k1 * (1932/2197)) + (k2 * (-7200/2197)) + (k3 * (7296/2197)))
k5 = h * derivative_function(state + (k1 * (439/216)) + (k2 * (-8)) + (k3 * (3680/513)) + (k4 * (-845/4104)))
k6 = h * derivative_function(state + (k1 * (-8/27)) + (k2 * (2)) + (k3 * (-3544/2565)) + (k4 * (1859/4104)) + (k5 * (-11/40)))
y1 = state + ((25/216) * k1) + ((1408/2565) * k3) + ((2197/4101) * k4) - ((1/5)*k5)
y2 = state + ((16/135) * k1) + ((6656/12825) * k3) + ((28561/56430) * k4) - ((9/50) * k5) + ((2/55) * k6)
return(y1, y2)
def integrate_RKF45(t0, tmax, tol, h_init, x_0, df, verbose = False):
"""
integrate a function whose derivative is df from t0 to tmax
t0: starting time
tmax: end time
h_init: initial timestep
x_0: starting position
df: a function which takes x and returns the derivative of a function at x
"""
h = h_init
x_i = x_0
t = t0
while t < tmax:
h = min(h, tmax - t)
y1, y2 = RKF45(x_i, df, h)
err_i = np.abs(y1 - y2)
R = 2 * err_i / h
delta = (tol/R)**(1/4)
if verbose:
print(f"t: {t:0.2e}, dt: {h:0.2e}, x: {x_i:0.2e}, err: {err_i:0.2e}")
if err_i < tol:
t += h
x_i = y1
elif err_i > tol:
h *= delta
return(x_i)
def exponential(x_0, k=1):
"""
A simple test function, this returns the input, so it'll integrate to e^x.
"""
return(k * x_0)
if __name__ == "__main__":
integrate_RKF45(t0 = 0.,
tmax = 0.15,
tol = 1e-4,
h_init = 1e-2,
x_0 = 1.,
df = exponential,
verbose=True)
因此,这段代码可以工作,只要它返回我给它的任何函数的积分的近似值。然而,局部截断误差似乎太大了。运行上面的代码将输出:
t: 0.00e+00, dt: 1.00e-02, x: 1.00e+00, err: 3.95e-06
t: 1.00e-02, dt: 1.00e-02, x: 1.01e+00, err: 3.99e-06
t: 2.00e-02, dt: 1.00e-02, x: 1.02e+00, err: 4.03e-06
t: 3.00e-02, dt: 1.00e-02, x: 1.03e+00, err: 4.07e-06
t: 4.00e-02, dt: 1.00e-02, x: 1.04e+00, err: 4.11e-06
t: 5.00e-02, dt: 1.00e-02, x: 1.05e+00, err: 4.16e-06
t: 6.00e-02, dt: 1.00e-02, x: 1.06e+00, err: 4.20e-06
t: 7.00e-02, dt: 1.00e-02, x: 1.07e+00, err: 4.24e-06
t: 8.00e-02, dt: 1.00e-02, x: 1.08e+00, err: 4.28e-06
t: 9.00e-02, dt: 1.00e-02, x: 1.09e+00, err: 4.32e-06
t: 1.00e-01, dt: 1.00e-02, x: 1.11e+00, err: 4.37e-06
t: 1.10e-01, dt: 1.00e-02, x: 1.12e+00, err: 4.41e-06
t: 1.20e-01, dt: 1.00e-02, x: 1.13e+00, err: 4.46e-06
t: 1.30e-01, dt: 1.00e-02, x: 1.14e+00, err: 4.50e-06
t: 1.40e-01, dt: 1.00e-02, x: 1.15e+00, err: 4.55e-06
其中 err
值是四阶方法和五阶方法之间的差异。我的印象是,n^th
阶方法的局部截断错误为 O(dt^(n+1))
,这意味着上面的集成应该有 1e-9
左右的错误,而不是 1e-6
。
那么到底是我的代码错误还是我的理解错误?谢谢!
最佳答案
参见https://math.stackexchange.com/questions/2701385/adaptive-step-size-in-rk45-for-second-order-ode/2701678#2701678 ,您似乎对方法系数使用了相同的损坏源。
y1 中的分母 4101 错误,它必须是 4104。
Delta 因子应该稍微缓和一些,delta = (tol/R)**(1/5)
或 delta = (tol/R)**(1/6)
,并应用到每一步,也是成功的。
本地错误 err_i
的引用错误是 tol*h
,这就是为什么在 R
中除以 h
.
这将导致您的测试场景以径向较少的迭代步骤进行
t: 0.000000e+00, dt: 1.00e-02, x: 1.000000e+00, err: 1.28e-13
t: 1.000000e-02, dt: 1.40e-01, x: 1.010050e+00, err: 6.60e-08
t: 1.500000e-01, dt: 3.88e-01, x: 1.161834e+00
或者稍微长一点的时间间隔来查看步长 Controller 的实际工作情况
t: 0.000000e+00, dt: 1.00e-02, x: 1.000000e+00, err: 1.28e-13
t: 1.000000e-02, dt: 2.27e-01, x: 1.010050e+00, err: 7.18e-07
t: 2.372490e-01, dt: 4.31e-01, x: 1.267757e+00, err: 2.02e-05
t: 6.680839e-01, dt: 4.76e-01, x: 1.950509e+00, err: 5.03e-05
t: 6.680839e-01, dt: 4.47e-01, x: 1.950509e+00, err: 3.73e-05
t: 1.115525e+00, dt: 3.84e-01, x: 3.051213e+00, err: 2.81e-05
t: 1.500000e+00, dt: 3.89e-01, x: 4.481769e+00
所有提到的更正都给出了 RKF45 中的新循环
while t < tmax:
h = min(h, tmax - t)
y1, y2 = RKF45(x_i, df, h)
err_i = np.abs(y1 - y2)
R = err_i / h
delta = 0.95*(tol/R)**(1/5)
if verbose:
print(f"t: {t:0.6e}, dt: {h:0.2e}, x: {x_i:0.6e}, err: {err_i:0.2e}")
if R < tol:
t += h
x_i = y1
h *= delta
if verbose:
print(f"t: {t:0.6e}, dt: {h:0.2e}, x: {x_i:0.6e}")
关于python - 了解自适应龙格库塔积分器的局部截断误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61978904/
如果我们定义一个像这样的函数 (defun foo(x) (setf x somevalue)) x 定义为局部变量还是全局变量?使用 setf/q 将值设置为全局值。如果它是全局的,谁能告诉我如
仍在学习 MVC3、EF。现在我正在连接到 MySql,但我相信这无关紧要。为简单起见,我决定为我的测试应用程序使用一个数据库,并且我包含了一个类别来区分数据。例如,我有一个新闻、事件、信息和页面类别
假设我定义了以下代码: int *func() { int *p=(int *)malloc(sizeof(int)); // memory is allocated from heap
我正在构建一个小型 PHP MVC,但我在一小部分编码方面碰壁了。我想我需要“局部 View ”,但我也许可以用现有代码实现一些东西。 目前我的 Controller 是最简单的形式: 实例化一个对象
假设我定义了以下代码: int *func() { int *p=(int *)malloc(sizeof(int)); // memory is allocated from heap
我有以下代码(用 Python 2.X 编写): def banana(x): def apple(stuff): x /= 10 return stuff -
我正在尝试重用一些代码,部分 View 似乎是使用 MVC 时执行此操作的最佳方式。 我创建了一个继承自 IEnumerable 的局部 View (见下文)。 @model IEnumerable
局部 const 变量将存储在哪里?我已经验证过,函数中使用 const 变量的每个位置都会被其值替换(如立即值寻址模式)。但如果指针被分配给它,那么它就会存储在堆栈中。在这里我不明白处理器如何知道其
我想将局部变量用作全局变量,有人告诉我这样做的方法是在函数外部创建变量,如下所示: var foo = null; function bar() {
我正在处理一个很长的 Angular 表格。我想知道我是否可以将它分成许多不同的 View 并在主视图中引用它们中的每一个。 First Section
我有一个导航栏,它是一个局部 View ,我需要在设计页面上呈现它,以便用户编辑他们的个人资料。事实上,我只有一个页面,但是添加执行帐户维护的路径搞乱了我的导航栏加载,因为实例变量不存在。无论如何,我
我没有用到全局变量,也从未明确定义过全局变量,但我的代码中似乎有一个。你能帮我把它做成本地的吗? def algo(X): # randomized algorithm while len(X
假设我有这个(当前无返回)函数: def codepoint_convert(text, offset): codepoint = text[offset] if codepoint
我在我的项目中同时使用了局部 View 和布局概念,但我无法区分。但我的感觉是两者都在做同样的工作。任何人都可以通过示例说出有关局部 View 和布局的简要概念以及区别吗? 最佳答案 除了 Josh
使用全局变量会加快速度吗?在英特尔的体系结构软件开发人员手册(关于微处理器)中建议使用局部变量而不是全局变量。但是,请考虑以下代码: void process_tcp_packets(void) {
我有一个局部 View 使用的模型与我在其中呈现它的 View 不同。我不断收到错误消息。 The model item passed into the dictionary is of type '
我在 cshtml 页面上有一个局部 View ,如下所示:- @model MvcCommons.ViewModels.CompositeViewModel @{ ViewBag.Title = "
我在从 while 循环全局更新数组时遇到问题,如下所述。请注意,我只能使用 C 95 及之前版本的功能。任何帮助将不胜感激!满浆箱http://pastebin.com/ss6VgTCD 在我的程序
我想刷新 Json 局部 View 。我正在尝试使用这个: $('#example123').load('@Url.Action("Rejestracja", "Logowanie")'); 但不能正
我有一个 asp.net 页面,它返回我当前正在使用的选项卡中的部分 View 。我已经设置了所有 jQuery 并且可以正常工作。它工作一次并通过 ajax 返回一个局部 View .html(re
我是一名优秀的程序员,十分优秀!