2017-08-17 4 views
0

を実装することはできません私はここで、「構文の簡素化」セクションからscipyのダウンロードスクリプトを実装しようとしています:http://scipy-cookbook.readthedocs.io/items/FittingData.htmlパイソン - scipyのダウンロードフィッティングスクリプトを

私のコードは非常に長いので、私は思われる部分だけを投稿します問題になる

私は、次のエラーメッセージが表示されます。TypeError: unsupported operand type(s) for *: 'int' and 'Parameter'、私は起こる理由を理解され:return self.amplitude() * np.exp(-1*self.decay_const()*x)

class Plot(): 

    def __init__(self,slice_and_echo,first_plot,right_frame): 

     self.slice_and_echo = slice_and_echo 
     self.first_plot  = first_plot 
     self.right_frame = right_frame 

     self.amplitude = Parameter(1) 
     self.decay_const = Parameter(1) 

    def function(self,x): 
     print(self.amplitude) 
     print(self.amplitude()) 
     return self.amplitude() * np.exp(-1*self.decay_const()*x) 

    def create_plot(self): 
     plot_figure = Figure(figsize=(10,10), dpi=100) 
     self.the_plot = plot_figure.add_subplot(111) 

     self.the_plot.plot(self.echoes,self.average,'ro') 

     print(self.amplitude()) 

     self.fit_parameters = self.fit(self.function,[self.amplitude,self.decay_const],self.average) 
     print(self.fit_parameters) 


    def fit(self,function, parameters, y, x=None): 

     def f(params): 
      i = 0 
      for p in parameters: 
       p.set(params[i]) 
       i += 1 
      return y - function(x) 

     if x is None: x = np.arange(y.shape[0]) 

     p = [param for param in parameters] 

     return optimize.leastsq(f, p) 

とパラメータ()クラスは、リンクの場合と同じである:それはこの部分での製品の

class Parameter: 
    def __init__(self, value): 
      self.value = value 

    def set(self, value): 
      self.value = value 

    def __call__(self): 
      return self.value 

問題は、私はcreate_plot(self):メソッドの内部でself.amplitude()を呼び出すときに、それが返す値が整数である、ということのようです(私が欲しいものです!)。しかし、私がfunction(self,x)メソッドの中で呼び出すと、それは起こりません。このメソッドの中で印刷すると、整数の代わりに<__main__.Parameter object at 0x1162845c0>が得られます。

同じクラスの異なるメソッドから呼び出されたときに異なる値が返されるのはなぜですか?私はここで何が欠けていますか?

ありがとうございました!

答えて

1

あなたはリストの理解に誤字があります。あなたのコードの状態:

p = [param for param in parameters] 

とサンプルコードの状態:

p = [param() for param in parameters] 

注あなたのケースであなたの代わりに数字のリストの種類Parameterのオブジェクトのリストを生成していること。

ところで、lmfitと呼ばれるモジュールをチェックしてください。これは、かなりの数のルーチンによるフィッティングを単純化します。

+0

よく知られている方程式に気付くことはできませんでした。私はずっと前から光子エコー減衰曲線を使っていましたので、このコードのいくつかが参考になるかもしれません:減衰曲線にフィット:https://github.com/9dogs/edp/blob/1b9d6629922db404ed397e150f9d1482be0b376e/main.py#L474フィットピークカーブ: https://github.com/9dogs/edp/blob/1b9d6629922db404ed397e150f9d1482be0b376e/fitting/fit.py#L41 – 9dogs

+0

ありがとうございます。私はそれを実装するために多くのことを試して、おそらくかっこをある時点で戻すのを忘れていました。 コードをありがとう!私はそれを見てみましょう! –

+0

私はlmfitを実装することができました!ありがとう!しかし、1つの質問:パラメータを抽出し、フィッティング曲線を作成する必要がありますか?または、最小化メソッドの出力からカーブを抽出できますか? –