2016-12-15 55 views
0

私はPythonコードを持っており、それをOctaveで書き直したいのですが、変換中に非常に多くの問題を抱えています。私はそれらのいくつかのための解決策を見つけました、そして、あなたの助けがまだ必要です。今、私はこのコードの一部で開始します:PythonからOctaveまたはMatlabへの変換/翻訳

INVOLUTE_FI = 0 
INVOLUTE_FO = 1 
INVOLUTE_OI = 2 
INVOLUTE_OO = 3 
def coords_inv(phi, geo, theta, inv): 
     """ 
     Coordinates of the involutes 

     Parameters 
     ---------- 
     phi : float 
      The involute angle 
     geo : struct 
      The structure with the geometry obtained from get_geo() 
     theta : float 
      The crank angle, between 0 and 2*pi 
     inv : int 
      The key for the involute to be considered 
     """ 

     rb = geo.rb 
     ro = rb*(pi - geo.phi_fi0 + geo.phi_oo0) 
     Theta = geo.phi_fie - theta - pi/2.0 

     if inv == INVOLUTE_FI: 
      x = rb*cos(phi)+rb*(phi-geo.phi_fi0)*sin(phi) 
      y = rb*sin(phi)-rb*(phi-geo.phi_fi0)*cos(phi) 
     elif inv == INVOLUTE_FO: 
      x = rb*cos(phi)+rb*(phi-geo.phi_fo0)*sin(phi) 
      y = rb*sin(phi)-rb*(phi-geo.phi_fo0)*cos(phi) 
     elif inv == INVOLUTE_OI: 
      x = -rb*cos(phi)-rb*(phi-geo.phi_oi0)*sin(phi)+ro*cos(Theta) 
      y = -rb*sin(phi)+rb*(phi-geo.phi_oi0)*cos(phi)+ro*sin(Theta) 
     elif inv == INVOLUTE_OO: 
      x = -rb*cos(phi)-rb*(phi-geo.phi_oo0)*sin(phi)+ro*cos(Theta) 
      y = -rb*sin(phi)+rb*(phi-geo.phi_oo0)*cos(phi)+ro*sin(Theta) 
     else: 
      raise ValueError('flag not valid') 

     return x,y 
    def CVcoords(CVkey, geo, theta, N = 1000): 
     """ 
     Return a tuple of numpy arrays for x,y coordinates for the lines which 
     determine the boundary of the control volume 
    Parameters 
     ---------- 
     CVkey : string 
      The key for the control volume for which the polygon is desired 
     geo : struct 
      The structure with the geometry obtained from get_geo() 
     theta : float 
      The crank angle, between 0 and 2*pi 
     N : int 
      How many elements to include in each entry in the polygon 

     Returns 
     ------- 
     x : numpy array 
      X-coordinates of the outline of the control volume 
     y : numpy array 
      Y-coordinates of the outline of the control volume 
     """ 

     Nc1 = Nc(theta, geo, 1) 
     Nc2 = Nc(theta, geo, 2) 

     if CVkey == 'sa': 

      r = (2*pi*geo.rb-geo.t)/2.0 

      xee,yee = coords_inv(geo.phi_fie,geo,0.0,'fi') 
      xse,yse = coords_inv(geo.phi_foe-2*pi,geo,0.0,'fo') 
      xoie,yoie = coords_inv(geo.phi_oie,geo,theta,'oi') 
      xooe,yooe = coords_inv(geo.phi_ooe,geo,theta,'oo') 
      x0,y0 = (xee+xse)/2,(yee+yse)/2 

      beta = atan2(yee-y0,xee-x0) 
      t = np.linspace(beta,beta+pi,1000) 
      x,y = x0+r*np.cos(t),y0+r*np.sin(t) 
       return np.r_[x,xoie,xooe,x[0]],np.r_[y,yoie,yooe,y[0]] 

https://docs.scipy.org/doc/numpy/reference/generated/numpy.r_.html私はちょうど最後の出力を理解ドント、と私はまだwhat'sがここ_R、そしてどのように私はオクターブでそれを書くことができます意味混同していますか? ....私はリンクに書かれているものを読むが、それでも私のためにはっきりしない。

答えて

0
return np.r_[x,xoie,xooe,x[0]], np.r_[y,yoie,yooe,y[0]] 

この関数は、両方ともnp.r_で作成された2つの値を返します。

np.r_[....]はインデックス構文を持ち、np.r_オブジェクトの関数呼び出しに変換されます。私はここのもののいずれかが表示されないけれども、それは、オブジェクトのようなslice6:8)を受け入れることができ[]表記で

In [355]: np.r_[1, 3, 6:8, np.array([3,2,1])] 
Out[355]: array([1, 3, 6, 7, 3, 2, 1]) 

:結果は、引数の単なる連結したものです。残りのコードを調べて、他の引数がスカラ(単一値)か配列かどうかを調べる必要があります。

私のオクターブは錆びています(ただし、私は変換を実験することができます)。 coords_invによって返される値の

t = np.lispace... # I think that exists in Octave, a 1000 values 
x = x0+r*np.cos(t) # a derived array of 1000 values 

xoie 1。スカラーまたは配列であってもよい。 x[0]の最初の値はxです。したがって、r_はおそらくxとそれ以降の値で構成される1d配列を生成します。

+0

ありがとうhpaulj ...私はちょうどあなたの答えですが、常に私の答えは@Bhargav Raoによって削除されました。コードに戻って、私はOctaveでnpを必要としないと思いますが、このOutputはどのようにするべきですか?私はこれを次のように書いた。x = [x、xoie、xooe、x(1)];それは正しくないのですか?オクターブまたはmatlabの他の質問は、値0または1で開始する必要がありますか? – Eyad

+0

np。同等の機能はすべて省略されています。インデックスは1から始まります。 – hpaulj

+0

okありがとうございますが、これまでのところ私の主な質問に対する正確な答えは得られませんでした...あなたは出力をどのように見せるのでしょうか? x = [x、xoie、xooe、x(1)]; – Eyad