两个微分方程组的RungeKutta实现

2024-09-28 05:26:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下微分方程组: enter image description here

根据论文,他们告诉我可以用RK四阶数值求解。在

如你所见,最后两个方程是耦合的,我构造了一个关联xn和yn的矩阵(概率),其中n=1..(n-对的计数,这里n等于4):向量([x1,x2,…,xn,y1,y2,…,yn])=概率.dot(向量([x1,x2,…,xn,y1,y2,…,yn]),其中质数是时间微分。但是每一步我都有额外的求和项(un*xn,yn也一样),这是我面临的第一个问题,不知道如何处理。在

我写了一段代码,出现了很多我无法处理的错误。在

当我试图独自应付时,我会非常感谢你的帮助。在

上面显示我的代码:

导入库

import numpy as np
import math
import scipy.constants as sc
from scipy.sparse import diags
from scipy.integrate import ode
import matplotlib.pyplot as plt
from matplotlib import mlab

初始数据和常数

^{pr2}$

*构造与dif/eq/概率关联的矩阵*

k = np.array([hn_nInc*np.ones(n-1),hn*np.ones(n),hn_nDec*np.ones(n-1)])
offset = [-1,0,1]
Probability = diags(k,offset).toarray() # bn(tk)=xn(tk)+iyn(tk)


xt0_list = [0] * n
yt0_list = [0] * n

*dif右侧。等式.*

# dimen_param = [un,vn,zn,vzn] [tn]
# x_list = [x1,...,xn] [tn]
# y_list = [y1,...,yn] [tn]

def fun(dimen_param, x_list, y_list):
    return dimen_param[1]

def fvn(dimen_param, x_list, y_list):
    return -(x_list[len(x_list)-1]**2 + y_list[len(y_list)-1]**2)- wn_prime*dimen_param[1] + Omega_n * (1-np.e ** (-ksi_n * dimen_param[0]))*np.e ** (-ksi_n * dimen_param[0])

def fzn(dimen_param, x_list, y_list):
    return dimen_param[3]

def fvzn(dimen_param, x_list, y_list):
    return -wn_prime * dimen_param[3]-(wn_sqr ** 2) * dimen_param[2] - 1

def fxn(dimen_param, x_list, y_list):
    return Probability.dot(y_list)

def fyn(dimen_param, x_list, y_list):
    return -Probability.dot(x_list)

#xv = [dimen_param, x_list, y_list]
def f(xv):

    k_d = xv[0:4]
    k_x = xv[4:4+len(xt0_list)]
    k_y = xv[4+len(xt0_list):4+len(xt0_list)+len(yt0_list)]

    return ([fun(k_d, k_x, k_y),fvn(k_d, k_x, k_y),fzn(k_d, k_x, k_y),fvzn(k_d, k_x, k_y),fxn(k_d, k_x, k_y),fyn(k_d, k_x, k_y)])

*四阶龙格-库塔方法的实现*

def RK4(f, dimen_paramT0, xt0_list, yt0_list):
    T = np.linspace(0, 1. / step, 1. / step +1)
    xvinit = np.concatenate([dimen_paramT0, xt0_list, yt0_list])
    xv = np.zeros( (len(T), len(xvinit)) )
    xv[0] = xvinit

    for i in range(int(1. / step)):
        k1 = f(xv[i])
        k2 = f(xv[i] + step/2.0*k1)
        k3 = f(xv[i] + step/2.0*k2)
        k4 = f(xv[i] + step*k3)
        xv[i+1] = xv[i] + step/6.0 *( k1 + 2*k2 + 2*k3 + k4)
    return T, xv

*正在运行*

print RK4(f, dimen_paramT0, xt0_list, yt0_list)

目前的问题是:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-104-be8ed2e50d37> in <module>()
----> 1 RK4(f, dimen_paramT0, xt0_list, yt0_list)

<ipython-input-103-8c48cf5efe73> in RK4(f, dimen_paramT0, xt0_list, yt0_list)
      7     for i in range(int(1. / step)):
      8         k1 = f(xv[i])
----> 9         k2 = f(xv[i] + step/2.0*k1)
     10         k3 = f(xv[i] + step/2.0*k2)
     11         k4 = f(xv[i] + step*k3)

TypeError: can't multiply sequence by non-int of type 'float'

Tags: importlenreturnparamdefstepnplist
1条回答
网友
1楼 · 发布于 2024-09-28 05:26:27

k1是一个python list,其中multiply表示“repeat”,因此

[1,2] * 3 == [1,2,1,2,1,2]

显然这对浮动没有意义

^{pr2}$

您需要numpy.ndarray的向量行为,其中

np.array([1,2])*2.0 == np.array([2.0, 4.0])

所以确保f的返回语句是:

return np.asarray([
    fun(k_d, k_x, k_y),
    fvn(k_d, k_x, k_y),
    fzn(k_d, k_x, k_y),
    fvzn(k_d, k_x, k_y),
    fxn(k_d, k_x, k_y),
    fyn(k_d, k_x, k_y)
])

根据记录,scipy已经有了一个RK4 solver,不需要实现自己的。在

相关问题 更多 >

    热门问题