3

この男がMATLAB で行ったことを Python で実行したいと考えています。

anaconda をインストールしたので、numpy と sympy のライブラリがあります。これまでのところ、numpy nsolve を試してみましたが、うまくいきません。私はPythonを初めて使用し、MATLABでそれを行う方法を知っていると言わなければなりません:P.

:

-2*log(( 2.51/(331428*sqrt(x)) ) + ( 0.0002 /(3.71*0.26)) ) = 1/sqrt(x)

通常、私はこれを反復的に解決します。左側の x を推測し、右側の x を解くだけです。解を左側に置き、もう一度解いてください。左の x が右に近づくまで繰り返します。私はどのような解決策が必要かという考えを持っています。

だから私はそれを行うことができましたが、それはあまりクールではありません。数字でやりたい。カシオの15ユーロの電卓でそのまま解けるから、そんなに複雑じゃないかな?

ご協力ありがとうございました、

編集:だから私は次のことを試しました:

from scipy.optimize import brentq

w=10;
d=0.22;
rho=1.18;
ni=18.2e-6;

Re=(w*d*rho)/ni
k=0.2e-3;
d=0.26;

def f(x,Re,k,d):
    return (
        -2*log((2.51/(Re*sqrt(x)))+(k/(3.71*d)),10)*sqrt(x)+1
            );

print(
    scipy.optimize.brentq
        (
        f,0.0,1.0,xtol=4.44e-12,maxiter=100,args=(),full_output=True,disp=True
        )
    );

そして、私はこの結果を得ます:

    r = _zeros._brentq(f,a,b,xtol,maxiter,args,full_output,disp)
TypeError: f() takes exactly 4 arguments (1 given)

定数も解いているからですか?

edit2: args=() キーワードを介して定数を割り当てる必要があると思うので、次のように変更しました:

f,0.0,1.0,xtol=4.44e-12,maxiter=100,args=(Re,k,d),full_output=True,disp=True

しかし今、私はこれを取得します:

-2*log((2.51/(Re*sqrt(x)))+(k/(3.71*d)),10)*sqrt(x)+1
TypeError: return arrays must be of ArrayType

とにかく、別の方程式を入れると、それが機能するとしましょう2*x*Re+(k*d)/(x+5)。そのため、方程式を変換する必要があると思います。

ここで死ぬ:log(x、10)..

edit4:正しい構文はlog10(x)です...今は動作しますが、結果としてゼロになります

4

3 に答える 3

1

これはうまくいきます。私はここでいくつかのことをしました。まず、とにかく定義したグローバル変数を使用して、関数のより単純な定義を使用しました。これは、args= をソルバーに渡すよりも少し良いと思います。また、そのようなものが必要になった場合に、独自のカスタム ソルバーを簡単に使用できるようにもなります。root特定のアルゴリズムを使用するのではなく、汎用関数をエントリ ポイントとして使用しました。後で別のメソッドを簡単に渡すことができるため、これは便利です。また、間隔をPEP 8で推奨されるように修正しました方程式の誤った書き直しを修正しました。あなたがしたように操作するよりも、単に LHS - RHS を書く方がより直感的だと思います。また、整数除算の問題を回避するために、すべての整数リテラルを 1.0 などに置き換えたことにも注意してください。0.02 は、摩擦係数のかなり標準的な開始点と見なされます。

import numpy
from scipy.optimize import root

w = 10.0
d = 0.22
rho = 1.18
ni = 18.2e-6

Re = w*d*rho/ni
k = 0.2e-3

def f(x):
    return (-2*numpy.log10((2.51/(Re*numpy.sqrt(x))) + (k/(3.71*d))) - 1.0/numpy.sqrt(x))

print root(f, 0.02)

また、固定小数点反復は、この問題に対するニュートンの方法よりも実際には高速であることにも言及する必要があります。f2次のように定義することにより、組み込みの固定小数点反復ルーチンを使用できます。

def f2(x):
    LHS = -2*numpy.log10((2.51/(Re*numpy.sqrt(x))) + (k/(3.71*d)))
    return 1/LHS**2

タイミング (収束の速度を示すためにルートからさらに開始):

%timeit root(f, 0.2)
1000 loops, best of 3: 428 µs per loop

%timeit fixed_point(f2, 0.2)
10000 loops, best of 3: 148 µs per loop
于 2013-09-19T14:41:19.977 に答える
0

あなたのタグは少しずれています:記号sympy計算用のライブラリであるとタグ付けしていますが、数値的に解決したいと言っています。後者が実際の意図である場合、関連する scipy ドキュメントは次のとおりです。

http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html#root-finding

于 2013-09-18T19:00:28.513 に答える