import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt import csv import os import glob import pandas as pd import math import cv2 Vr = 1 π = math.pi m = 0.0156 Cn = 6.83879 D = 0.016 H = 0.04 L = 0.3 ρ = 1.18 M = (m/(ρ*H*D*L))*(D/H) CL = 0.5 C = (4*π*Cn)/Vr F = CL/(2*M) # mk system def func(state,t, m, k, FL): x1, x2 = state dx2dt = - 2 * (Cn/m) * x2 - (k/m) * x1 + FL/m return [x2, dx2dt] m = Vr/(2*π) # 質量[kg] k = 1 # 剛性[N/m] FL = (ρ*(H*H)*L*CL)/2 state0 = [0.0, 0.1] # 初期値[x0, v0] t0 = 0 # 初期時間[s] tf = 1 # 終了時間[s] dt = 0.005 # 時間刻み[s] t = np.arange(t0, tf+dt, dt) # 時間軸配列 # odeintを使った解法 # x1, x2の解を求めているので、sol[0]が変位x1, sol[1]が速度x2となる sol = odeint(func, state0, t, args=(m,k)) print(sol) omega = np.sqrt(k/m) theory = (state0[0] * omega * np.cos(omega * t)) +\ ((state0[1]/omega) * np.sin(omega * t)) # ここからグラフ描画 # フォントの種類とサイズを設定する。 plt.rcParams['font.size'] = 14 plt.rcParams['font.family'] = 'Times New Roman' # 目盛を内側にする。 plt.rcParams['xtick.direction'] = 'in' plt.rcParams['ytick.direction'] = 'in' # グラフの上下左右に目盛線を付ける。 fig = plt.figure() ax1 = fig.add_subplot(111) ax1.yaxis.set_ticks_position('both') ax1.xaxis.set_ticks_position('both') # 軸のラベルを設定する。 ax1.set_xlabel('Time [s]') ax1.set_ylabel('Displacement [m]') # データの範囲と刻み目盛を明示する。 ax1.set_xticks(np.arange(0, 2, 0.2)) ax1.set_yticks(np.arange(-1, 1, 0.001)) ax1.set_xlim(0, 1) ax1.set_ylim(-0.005, 0.005) # データプロット ax1.plot(t, sol[:,0], label='Python odeint [x0=0, v0=0.1]', c='b', marker='o', linestyle='None') ax1.plot(t, theory, label='Theory', c='r') fig.tight_layout() plt.legend(loc='upper left') # グラフを表示する。 plt.show() plt.close()
上記のようなばねマスダンパ系の運動方程式を解きたいです.
しかし,下記のようにエラーが出てしまいました.
どのように改良したらよいでしょうか?
また,x2の初期値をt=Vr/4のときに0にしたいのですが,どのように改良したらよいでしょうか?
TypeError: func() missing 1 required positional argument: 'FL'
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/10 06:15