首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于求解ODEs Python系统的Runge-Kutta 4

用于求解ODEs Python系统的Runge-Kutta 4
EN

Stack Overflow用户
提问于 2020-08-26 22:19:21
回答 2查看 2K关注 0票数 0

我为Runge 4编写了代码,用于求解ODEs系统。

它适用于一维ODE,但当我试图解决x'' + kx = 0时,我在定义向量函数时遇到了问题:

u1 = xu2 = x' = u1',然后系统看起来像:

代码语言:javascript
复制
u1' = u2
u2' = -k*u1

如果是u = (u1,u2)f(u, t) = (u2, -k*u1),那么我们需要解决:

代码语言:javascript
复制
u' = f(u, t)
代码语言:javascript
复制
def f(u,t, omega=2):
    u, v = u
    return np.asarray([v, -omega**2*u])

我的全部代码是:

代码语言:javascript
复制
import numpy as np

def ode_RK4(f, X_0, dt, T):    
    N_t = int(round(T/dt))
    #  Create an array for the functions ui 
    u = np.zeros((len(X_0),N_t+1)) # Array u[j,:] corresponds to the j-solution
    t = np.linspace(0, N_t*dt, N_t + 1)
    # Initial conditions
    for j in range(len(X_0)):
        u[j,0] = X_0[j]
    # RK4
    for j in range(len(X_0)):
        for n in range(N_t):
            u1 = f(u[j,n] + 0.5*dt* f(u[j,n], t[n])[j], t[n] + 0.5*dt)[j]
            u2 = f(u[j,n] + 0.5*dt*u1, t[n] + 0.5*dt)[j]
            u3 = f(u[j,n] + dt*u2, t[n] + dt)[j]
            u[j, n+1] = u[j,n] + (1/6)*dt*( f(u[j,n], t[n])[j] + 2*u1 + 2*u2 + u3)
    
    return u, t

def demo_exp():
    import matplotlib.pyplot as plt
    
    def f(u,t):
        return np.asarray([u])

    u, t = ode_RK4(f, [1] , 0.1, 1.5)
    
    plt.plot(t, u[0,:],"b*", t, np.exp(t), "r-")
    plt.show()
    
def demo_osci():
    import matplotlib.pyplot as plt
    
    def f(u,t, omega=2):
        # u, v = u Here I've got a problem
        return np.asarray([v, -omega**2*u])
    
    u, t = ode_RK4(f, [2,0], 0.1, 2)
    
    for i in [1]:
        plt.plot(t, u[i,:], "b*")
    plt.show()

提前,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-27 08:38:00

您在正确的路径上,但是当将时间积分方法(如RK )应用到向量值的one中时,一个方法实际上做的事情与标量情况下的完全相同,只是使用向量。

因此,您跳过了for j in range(len(X_0))循环和相关的索引,并确保将初始值作为向量(numpy数组)传递。

还对t的指数化进行了一些清理,并将解决方案存储在一个列表中。

代码语言:javascript
复制
import numpy as np

def ode_RK4(f, X_0, dt, T):    
    N_t = int(round(T/dt))
    # Initial conditions
    usol = [X_0]
    u = np.copy(X_0)
    
    tt = np.linspace(0, N_t*dt, N_t + 1)
    # RK4
    for t in tt[:-1]:
        u1 = f(u + 0.5*dt* f(u, t), t + 0.5*dt)
        u2 = f(u + 0.5*dt*u1, t + 0.5*dt)
        u3 = f(u + dt*u2, t + dt)
        u = u + (1/6)*dt*( f(u, t) + 2*u1 + 2*u2 + u3)
        usol.append(u)
    return usol, tt

def demo_exp():
    import matplotlib.pyplot as plt
    
    def f(u,t):
        return np.asarray([u])

    u, t = ode_RK4(f, np.array([1]) , 0.1, 1.5)
    
    plt.plot(t, u, "b*", t, np.exp(t), "r-")
    plt.show()
    
def demo_osci():
    import matplotlib.pyplot as plt
    
    def f(u,t, omega=2):
        u, v = u 
        return np.asarray([v, -omega**2*u])
    
    u, t = ode_RK4(f, np.array([2,0]), 0.1, 2)
    
    u1 = [a[0] for a in u]
    
    for i in [1]:
        plt.plot(t, u1, "b*")
    plt.show()
票数 2
EN

Stack Overflow用户

发布于 2020-08-26 23:22:20

模型如下:在这里输入图像描述

从兰登登的“计算编程- Python”一书。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63606503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档