Решение ODE в сложной области с помощью Python (или Matlab)

В качестве теста для более сложной системы я хочу решить дифференциальное уравнение dw/dz = w, где функция w = w(z) является комплексной, а z = x+iy, как обычно. Граничные условия таковы: w = i, когда z = i. Решение, конечно, сложное и определено на аргановой плоскости. Я надеялся решить эту проблему с помощью некоторых стандартных решателей ODE в python. Мой метод состоит в том, чтобы сначала определить сетку в плоскости арганда (линии с постоянными x и y), а затем перебрать каждую линию сетки и вызвать решатель ОДУ на каждой итерации. В приведенном ниже коде я пытаюсь интегрировать свое дифференциальное уравнение между 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)

person Dipole    schedule 27.11.2013    source источник
comment
Я человек Matlab, поэтому я не уверен, правильно ли я читаю код, но мне интересно, может ли проблема быть с z. Это чисто воображаемый вектор. Если такой вектор используется для tspan с одним из решателей ОДУ Matlab (например, ode45), возникает ошибка: записи в tspan должны строго увеличиваться или уменьшаться. Действительно ли z должно быть сложным? Вы уверены, что использование интегратора ODE целесообразно, а не квадратурный метод< /а>?   -  person horchler    schedule 28.11.2013
comment
Спасибо за ваш ответ. Действительно, z должен быть сложным, так как я хочу найти значение комплексной функции w(z) в каждой точке сетки на аргановой (сложной) плоскости. Я не уверен в квадратурных методах, мне действительно все равно, какой метод используется, если я получаю хорошее приближение для функции w (определяемой дифференциальным уравнением) по заданной двумерной сетке на комплексной плоскости.   -  person Dipole    schedule 07.02.2014