2015-01-05 3 views
6

私はローミングボートを動かしている小さなプログラムに取り組んでいます。ボートが毎分ストローク数とペースと行を持っているあなたが見ることができるようにローミングストロークに似たコード

import time 
class Boat: 
    def __init__(self, pace, spm): 
     self.pace = pace #velocity of the boat in m/s 
     self.spm = spm #strokes per minute 
     self.distance = 0 #distance travelled 

    def move(self, deltaT): 
     self.distance = self.distance + (self.pace * deltaT) 

boat1 = Boat(3.33, 20) 
while True: 
    boat1.move(0.1) 
    print boat1.distance 
    time.sleep(0.1) 

:以下は、簡単なサンプルコード(Pythonの2.xの)を示しています。毎回メソッドmove(deltaT)が呼び出されるたびに、ペースに従って一定の距離を移動します。

上記のボートはちょうど一定のペースで移動しますが、現実的ではありません。実際のローティングボートはストロークの開始時に加速し、ローティングブレードが水を去った後減速する。典型的なローイング曲線(ここで示す力、速度が似ています)を示し、多くのグラフオンラインがあります。

Rowing Stroke Graph 出典:highperformancerowing.net

ペースが経時的に一定でなければなりませんが、それはストローク中に変更する必要があります。

定速度を(少なくとも基本的に)より現実的なローティング・ストロークに似た曲線に変更する最良の方法は何ですか?

注:この質問にタグを付ける方法についてのアイデアはありますか?それはアルゴリズム問題ですか?

+1

SciPyなどのスプライン補間を使用します。 – nwk

+0

統計情報のSEサイトも参照してください。http://stats.stackexchange.com – smci

+0

ggplotライブラリの平滑化変換stat_smooth。 – smci

答えて

2

あなたの目標は、単に完全な物理シミュレーションを行うために、視覚的にもっともらしい何かを思い付くとしない場合は、単に位置に正弦波を追加することができます。

class Boat: 
    def __init__(self, pace, spm, var=0.5): 
     self.pace = pace #average velocity of the boat in m/s 
     self.sps = spm/60.0 #strokes per second 
     self.var = var  #variation in speed from 0-1 
     self.totalT = 0  #total time 
     self.distance = 0 #distance traveled 

    def move(self, deltaT): 
     self.totalT += deltaT 
     self.distance = self.pace * (self.totalT + self.var * math.sin(self.totalT * self.sps * 2*math.pi) 

は、あなたはそれがボートが後方に行くと錯覚を破壊する可能性が高くなりすぎた場合、変動varに注意する必要があります。

+0

ストロークで10m/sの速度と20行30mのロッカーをテストしたので、コードの結果は動作します:https://ideone.com/wHjZs3 ストローク中の速度は前後にジャンプする。計算に何が間違っているのでしょうか?ペースを時間の代わりに正弦波にする必要はありませんか? – MOnsDaR

+0

@MOnsDaR申し訳ありませんが、私は作成した訂正がありましたが、答えにコピーしませんでした。 '/ self.sps'は' * self.sps'でなければなりません。 –

+0

それはトリックでしたが、値は正弦波に沿って増減しています:https://ideone.com/2Cb6u8しかし、曲線は私が予想していたものとはちょうど逆です:それは速く始まり、遅くなり、速く終わります。それは別の方法です。私は式で周りを回ったが、それが正しく実行することができなかった、あなたは最後の1つを助けることができる? – MOnsDaR

1

このような曲線を速度の多項式に変換することができます。

これを行う方法の説明/例はで見つけることができます:

python numpy/scipy curve fitting

これは、xのセットを取る方法を示し、既存の検査によって取得することができ、y座標(プロットまたは実際のデータから)、多項式関数を作成します。

各ボートオブジェクトに同じカーブを使用している場合は、プログラムにハードコードするだけで済みます。しかし、それぞれのボートオブジェクトに対して別々の多項式を持つこともできます。ただし、各ボートやボートは異なるプロファイルを持つと仮定します。

+1

あなたのグラフにY軸に力があることに気がつきました。力は質量*加速です。あなたの質量は一定であるので、基本的には加速度のプロットです(速度ではありません)。 – jrel

+0

これは先進的なアプローチですが、現在は多少複雑です。アプリケーションにもっと洗練されたソリューションが必要なときには、これを考慮に入れてください。 – MOnsDaR

1

微分方程式の単純な積分を実行できます。

ストローク中に一定の力を加え、滑りの間力がない単純なモデルを想定し、ドラッグに比例してドラッグします(これは、時間の関数として空間を得るために既に行っています)。スピード。

したがって、加速度は、ストローク中にa = P - D.v、滑り(減速)中に- D.vです。

速度はv' = v + a.dtで近似されます。

このスペースは、x' = x + v.dtで近似されます。

dtが十分に小さい場合、この動きは現実的に見えるはずです。より正確な力の法則とRunge-Kuttaのようなより良い統合手法でモデルを改良することができますが、それが価値があるかどうかは分かりません。

このテクニックを使用したスピードとスペースの比較プロットの例を以下に示します。それは、周期的な体制を迅速に確立する速度振動と、うねりを伴う準線形変位を示す。

enter image description here

+0

これは十分に良いソリューションだと思います。しかし、私の質問は、「カーブをローイングストロークのようにモデル化するにはどうすればよいのですが、全体的なペースを維持するにはどうすればいいのですか? – MOnsDaR

関連する問題