2016-09-26 1 views
1
from __future__ import division 
import numpy as np 
import matplotlib.pyplot as plt 

def f(x, t):  #function for x'(t) = f(x,t) 
    return -x 

def exact(t):  #exact solution 
    return np.exp(-t) 

def Rk4(x0, t0, dt):  #Runge-Kutta Fourth Order Approximation 
    t = np.arange(0, 1+dt, dt) 
    n = len(t) 
    x = np.array([x0]*n) 
    E = np.array([x0]*n) 
    E0 = x0-exact(1) 
    x[0],t[0],E[0] = x0,t0,E0 
    for i in range(n-1): 
     h = t[i+1] - t[i] 
     k1 = h*f(x[i], t[i]) 
     k2 = h*f(x[i] + 0.5 * k1, t[i] + 0.5 * h) 
     k3 = h*f(x[i] + 0.5 * k2, t[i] + 0.5 * h) 
     k4 = h*f(x[i] + k3, t[i+1]) 
     x[i+1] = x[i] + (k1 + 2.0*(k2 + k3) + k4)/6.0 
     E[i+1] = E[i]+(x[i+1]-x[i]) 
    return E 

vecRk4 = np.vectorize(Rk4) 
dtime = np.arange(10e-4,1,10e-5) 
S = vecRk4(1.0,0.0,dtime) 
plt.plot(dtime,S) 

Я просто пытаюсь построить функцию Rk4 для x0 = 1.0, t0 = 0.0 как функцию dt. Я попробовал путем векторизации функции и создания массива для timestep dt, но получим ошибку «ValueError: установка элемента массива с последовательностью».Как построить определенную функцию по одному из своих аргументов в Python

ответ

1

Проблема в том, что ваше возвращаемое значение E - это не один номер, а массив numpy.

Vectorizing Многие массивы предоставят вам список, векторизация многих массивов numpy здесь не работает.

Чтобы вернуться к первоначальному вопросу: Путь построить функцию против одного из своих аргументов с помощью векторизации является:

from __future__ import division 
import numpy as np 
import matplotlib.pyplot as plt 

def myfunc(a,b): 
    return 2*b+a 


vecRk4 = np.vectorize(myfunc) 
dtime = np.arange(10e-4,1,10e-5) 
S = vecRk4(a=3, b=dtime) 
plt.plot(dtime,S) 
plt.show() 

enter image description here

Смежные вопросы