2017-02-09 11 views
0

二分法でコードを実行するだけで忙しいです。もちろん、スクリプトを書いて実行するのは簡単です。しかし、x^2のような式を入力とする関数を定義したいときに、このトリックが発生します。私は一緒に何かを廃棄しました。一種の仕事は終わったが、最初のif文では関数に関数を乗算できないという不満がある。どうすればこの問題も解決できますか? 質問する前にこの問題について私の宿題を本当にやってみましたが、残念ながら解決策を見つけることはできません。私はちょうどこれを行う方法を知っていることが大好きです。Pythonで式を入力として受け入れる関数を作成します

from sympy.abc import x 

def bisect(f, a, b): 
    f = lambda x: f 
    f_a, f_b = f(a), f(b) 
    tol = 1e-4 
    count = 0 
    print '\t'.join(['Step' , 'a', 'b', 'c', 'f(c) ' , '(b-a)/2)']) 
    while (b-a)/float(2) > tol: 
     c = (a+b)/2 
     f_c = f(c) 
     print '\t'.join([str(count) , str(a) , str(b) , str(c), str((b-a)/float(2))]) 
     if f_a*f_c < 0: 
      b = c 
      f_b = f_c 
     else: 
      a = c 
      f_a = f_c 
     count = count + 1 
+0

ことができます整理自分のインデントしてください。あなたが単にラムダとしてfを渡すように求めていることを解決する最良の方法 - 引数として式を渡すことはできません。 –

答えて

0

これは知っておくべきことですか?

>>> def demo(func): 
... for i in range(5): 
...  print func(float(i)) 
... 
>>> demo(lambda x: x**2 + 2*x - 5) 
-5.0 
-2.0 
3.0 
10.0 
19.0 

はまたdefと同様にlambdaで定義されたワンライナーで作成した関数に渡すことができます。上記は受け入れて、あなたが知りたいと思うかもしれない他の事は

definition = "x**2 + 2*x - 5" # or read it from the user as text input 
demo(eval("lambda x: " + definition)) 

作品...

義務警告、 "evalが悪である" ということです

def foo(x): 
    return x**2 + 2*x - 5 

demo(foo) 

と同じですユーザーからのPythonコードを実行し、それを実行することは、一般的にセキュリティーのno-no-noとみなされます。しかし、このコードが数学的な形式をプロットすることを実験している同じユーザーによって実行されている場合、それほど大きな害はありません。彼はコマンドラインでpythonでできることよりも悪いことはできません。あなたがウェブサーバなどでこのようなことをしていたなら、私はあなたの雇用とその将来の見通しを恐れるでしょう!

+0

ありがとう、私は本当にあなたのソリューションと将来の目的のために警告するだけでなく、助けていただきありがとうございます。幸いにも、私は適用された数学を勉強している学生で、まだ学部のみです。だからpythonはmatlabにちょうど私の代案です...それは絶対に破壊されます。しかし、その素朴な韻を覚えています。 –

0

のは、あなたがsympyを使用して機能fための式を作成したと仮定しましょう:あなたはlambda定義を変更した場合

f = x**2-0.1 

あなたbisect機能が動作します:

def bisect(fexpr, a, b): 
    f = lambda xval: fexpr.subs(x,xval) 
    f_a, f_b = f(a), f(b) 
    ... 
関連する問題