使用Python(或Matlab)解决复杂域中的ODE

时间:2013-11-27 17:23:50

标签: python matlab numerical-methods

作为对更复杂系统的测试,我想求解微分方程dw / dz = w,其中函数w = w(z)是复数值并且z = x + iy像往常一样。当z = i时,边界条件是w = i。解决方案当然很复杂,并且在argand平面上定义。我希望用python中的一些标准ODE求解器来解决这个问题。我的方法是首先在argand平面中定义网格(常量x和y的线),然后循环遍历每个网格线并在每次迭代时调用ODE求解器。在下面的代码中,我试图将我的微分方程在1j和2j之间进行积分,但是w的结果向量只是1j!谁能告诉我该怎么办?感谢

    from scipy.integrate import ode
    import numpy as np
    from matplotlib.pylab import *


    def myodeint(func, w0, z):
        w0 = np.array(w0, complex)
        func2 = lambda z, w: func(w, z)   # odeint has these the other way :/
        z0 = z[0]
        solver = ode(func2).set_integrator('zvode').set_initial_value(w0, z0)
        w = [solver.integrate(zp) for zp in z[1:]]
        w.insert(0, w0)
        return np.array(w)

    def func2(w, z, alpha):
        return alpha*w

    if __name__ == '__main__':
        # Set grid size in z plane
        x_max = 3
        x_min = 0
        y_max = 3
        y_min = 0

        # Set grid resolution
        dx = 0.1
        dy = 0.1

        # Number of nodes
        x_nodes = int(np.floor((x_max-x_min)/dx)+1)
        y_nodes = int(np.floor((y_max-y_min)/dy)+1)

        # Create array to store value of w(z) at each node

        ww = np.zeros((y_nodes,x_nodes), complex)

        # Set boundary condition: w = w0 at x = x0, y = y0
        x0 = 0
        y0 = 1
        i0 = (x0-x_min)/dx
        j0 = (y_max-y0)/dy
        w0 = 1j
        ww[j0,i0] = w0


        z0 = 1j

        alpha = 1
        z = np.linspace(z0, z0+1j, 200)
        w = myodeint(lambda w, z: func2(w, z, alpha), [w0, 0, 0], z)

0 个答案:

没有答案