2016-10-16 1 views
1

は、私はこのウェブサイトからそれを学ぶしようとしています:http://nbviewer.jupyter.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/01_phugoid/01_03_PhugoidFullModel.ipynb数値差分式はオイラー法を用いた解決しようとすると、無効な値エラー

私は、できるだけ助けを借りて、それをコード化しようとしていたが、私はこのエラーを取得保管:

C:\ Users \ユーザー "マイ本名" \ Anaconda2 LIB用の\のsite-packages \ \ ipykernel__main __ PY:29:RuntimeWarning:double_scalars私のプロット上のデータがない点に

に遭遇した無効な値。だから私は文字通り、ウェブサイトから直接すべてのコードを貼り付けましたが、私はまだそこにエラーが発生します!私はあきらめる、誰かがpython初心者を助けることができますか?

import numpy as np 
from matplotlib import pyplot 
from math import sin, cos, log, ceil 
%matplotlib inline 
from matplotlib import rcParams 
rcParams['font.family'] = 'serif' 
rcParams['font.size'] = 16 

# model parameters: 
g = 9.8  # gravity in m s^{-2} 
v_t = 30.0 # trim velocity in m s^{-1} 
C_D = 1/40 # drag coefficient --- or D/L if C_L=1 
C_L = 1 # for convenience, use C_L = 1 

### set initial conditions ### 
v0 = v_t  # start at the trim velocity (or add a delta) 
theta0 = 0 # initial angle of trajectory 
x0 = 0  # horizotal position is arbitrary 
y0 = 1000 # initial altitude 



def f(u): 

    v = u[0] 
    theta = u[1] 
    x = u[2] 
    y = u[3] 
    return np.array([-g*sin(theta) - C_D/C_L*g/v_t**2*v**2, -g*cos(theta)/v + g/v_t**2*v, v*cos(theta), v*sin(theta)]) 

def euler_step(u, f, dt): 
    u + dt * f(u) 

T = 100       # final time 
dt = 0.1       # time increment 
N = int(T/dt) + 1     # number of time-steps 
t = np.linspace(0, T, N)  # time discretization 

# initialize the array containing the solution for each time-step 
u = np.empty((N, 4)) 
u[0] = np.array([v0, theta0, x0, y0])# fill 1st element with initial values 

# time loop - Euler method 
for n in range(N-1): 
    u[n+1] = euler_step(u[n], f, dt) 





x = u[:,2] 
y = u[:,3] 


pyplot.figure(figsize=(8,6)) 
pyplot.grid(True) 
pyplot.xlabel(r'x', fontsize=18) 
pyplot.ylabel(r'y', fontsize=18) 
pyplot.title('Glider trajectory, flight time = %.2f' % T, fontsize=18) 
pyplot.plot(x,y, 'k-', lw=2); 

答えて

0

解決策は非常に簡単です。あなたはeuler_stepでreturn文を忘れました。

def euler_step(u, f, dt): 
    return u + dt * f(u) 

へ 変更

def euler_step(u, f, dt): 
    u + dt * f(u) 

、それは

+0

に動作します、ありがとうございましたが、今私は私のyの値のための平らな直線を入手!あなたはコードを実行して、同じものを取得することができますか? –

+0

私はいくつかの下向きの軌道を得るので、うまくいくようです。 yの値を直接調べて、プロットや計算の問題であるかどうかを確認できますか? – Jannick

+0

非常に奇妙なことに、私はy値を表示しており、すべて1000で一定です。 –

関連する問題