Python 龙格-库塔逼近贝塞尔函数,二阶微分方程

Python 龙格-库塔逼近贝塞尔函数,二阶微分方程,python,runge-kutta,Python,Runge Kutta,我想用龙格库塔近似贝塞尔函数。我在这里使用RK4,因为我不知道对于一个常微分方程组,RK2的方程是什么……基本上它不起作用,或者至少它不起作用,我不知道为什么 无论如何,它是用python编写的。以下是代码: from __future__ import division from pylab import* #This literally just makes a matrix def listoflists(rows,cols): return [

我想用龙格库塔近似贝塞尔函数。我在这里使用RK4,因为我不知道对于一个常微分方程组,RK2的方程是什么……基本上它不起作用,或者至少它不起作用,我不知道为什么

无论如何,它是用python编写的。以下是代码:

    from __future__ import division 
    from pylab import* 


    #This literally just makes a matrix 
    def listoflists(rows,cols): 
return [[0]*cols for i in range(rows)] 


    def f(x,Jm,Zm,m): 
        def rm(x): 
            return (m**2 - x**2)/(x**2) 
        def q(x):
            return 1/x
        return rm(x)*Jm-q(x)*Zm

    n = 100 #No Idea what to set this to really 
    m = 1 #Bessel function order; computes up to m (i.e. 0,1,2,...m)
    interval = [.01, 10] #Interval in x 
    dx = (interval[1]-interval[0])/n #Step size 
    x = zeros(n+1) 
    Z = listoflists(m+1,n+1) #Matrix: Rows are Function order, Columns are integration step (i.e.                 function value at xn)
    J = listoflists(m+1,n+1) 

    x[0] = interval[0] 
    x[n] = interval[1]

    #This reproduces all the Runge-Kutta relations if you read 'i' as 'm' and 'j' as 'n'
    for i in range(m+1): 
        #Initial Conditions, i is m 
        if i == 0: 
            J[i][0] = 1 
            Z[i][0] = 0
        if i == 1: 
            J[i][0] = 0 
            Z[i][0] = 1/2 
        #Generate each Bessel function, j is n 
        for j in range(n):  
            x[j] = x[0] + j*dx 

            K1 = Z[i][j]
            L1 = f(x[j],J[i][j],Z[i][j],i)
            K2 = Z[i][j] + L1/2 
            L2 = f(x[j] + dx/2, J[i][j]+K1/2,Z[i][j]+L1/2,i) 
            K3 = Z[i][j] + L2/2 
            L3 = f(x[j] +dx/2, J[i][j] + K2/2, Z[i][j] + L2/2,i)
            K4 = Z[i][j] + L3 
            L4 = f(x[j]+dx,J[i][j]+K3, Z[i][j]+L3,i) 

            J[i][j+1] = J[i][j]+(dx/6)*(K1+2*K2+2*K3+K4) 
            Z[i][j+1] = Z[i][j]+(dx/6)*(L1+2*L2+2*L3+L4) 

    plot(x,J[0][:])
    show()  

你能详细说明一下“工作不太好”吗?它是否产生异常等?干杯。它应该复制这一页上的情节(或者至少是非常类似的内容),但事实并非如此。它做了一些奇怪的事情。你能跑吗?只要你有我导入的python包,它就完全是独立的?它生产什么?或者它根本不起作用吗?它对m=0和m=1起作用,并产生以下结果(分别)请注意,在这两种情况下,它都不是“正确开始”,看看m=1时它有多大。它对于m>1不起作用,因为边界条件状态为J_m(0)=0和Z_m(0)=0,所以一切都是零,我不知道应该如何解决这个问题。@GeneralPancake您可以提供一些单元测试,它应该通过,但不通过。这可能是沟通失败地点和方式的“最佳”方式。