7

Scipyバージョン0.10.0

次のことを考慮してください。

>>> import math
>>> from scipy.optimize import fsolve
>>> import numpy as np
>>> def p(s, l, k, q):
    p = q * np.maximum(s - k, 0.0)
    return (p + math.copysign(l, -q)) * math.fabs(q) * 100.0

>>> x0 = fsolve(p, np.arange(33.86, 50.86, 1.0), args=(1.42, 41.0, -1.0), xtol=1e-06, maxfev=500)
Warning (from warnings module):
  File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 152
    warnings.warn(msg, RuntimeWarning)
RuntimeWarning: The iteration is not making good progress, as measured by the 
   improvement from the last ten iterations.
>>> print x0
[ -4.87169392e+05  -4.87168392e+05  -4.87167392e+05  -4.87166392e+05
  -4.87165392e+05  -4.87164392e+05  -4.87163392e+05  -4.87162392e+05
   4.24200000e+01   4.24200000e+01   4.24200000e+01   4.24200000e+01
   4.24200000e+01   4.24200000e+01   4.24200000e+01   4.24200000e+01
   4.24200000e+01]

最初の質問は、返される警告メッセージをどのように抑制することができるかということです。

第二に、なぜこのエラーが最初に生成されるのでしょうか(明らかなことを除いて、反復がうまく進んでいないということです:))?

最後に、この関数のルートは42.42(これは見つかりました)です。なぜfzero戻っ-4.87e+05てくるのですか?

4

2 に答える 2

9

これを行うと、重要な何かを見逃す可能性がありますが、警告メッセージを消音するには、次のように使用できますwarnings.filterwarnings

import warnings
warnings.filterwarnings('ignore', 'The iteration is not making good progress')
import math
from scipy.optimize import fsolve
import numpy as np
def p(s, l, k, q):
    p = q * np.maximum(s - k, 0.0)
    return (p + math.copysign(l, -q)) * math.fabs(q) * 100.0

x0 = fsolve(p, np.arange(33.86, 50.86, 1.0),
            args=(1.42, 41.0, -1.0), xtol=1e-06, maxfev=500)
print(x0)

実際、p(x0, 1.42, 41.0, -1)はゼロに近いわけではないのでfsolve、解決策が見つからなかったことを正しく警告しています。


PS。あなたが言う時

fsolve(p, np.arange(33.86, 50.86, 1.0),...)

fsolveの最初の推測sはnumpy配列であると言っていますnp.arange(33.86, 50.86, 1.0)。配列全体が一度に渡されpます。

np.arange(33.86, 50.86, 1.0)長さが17であることに注意してください。また、も同様x0です。これは、fsolveを解く長さ17の配列を探していると考えているためpです。

sおそらくあなたはフロートになるつもりだったと思いますか?その場合、最初の推測では1つのfloat値のみを渡すことができます。

fsolve(p, 41.0, args = (1.42, 41.0, -1.0), xtol=1e-06, maxfev=500)

例えば、

import math
import scipy.optimize as optimize
import numpy as np

def p(s, l, k, q):
    p = q * np.maximum(s - k, 0.0)
    return (p + math.copysign(l, -q)) * math.fabs(q) * 100.0

args = (1.42, 41.0, -1.0)
result = optimize.fsolve(p, 41.0, args=args, xtol=1e-06, maxfev=500)
print(result)

収量

[ 42.42]

fsolve最初の推測が>=41.0(の値k)の場合はルートをゼロにするという適切な仕事をしますが、最初の推測が<41.0の場合は失敗します。

私の推測では、これはnp.maximumの多くの推測で変更されていないためsです。したがってfsolve、増加するか減少するかがわからず、s間違って推測sし、ルートからどんどん遠くに移動する傾向があります。

于 2012-11-27T20:49:07.993 に答える
0
import math
import scipy.optimize as optimize
import numpy as np

def p(s, l, k, q):
    p = q * np.maximum(s - k, 0.0)
    return (p + math.copysign(l, -q)) * math.fabs(q) * 100.0


result = optimize.fsolve(p, 41.0, args=1,2,3, xtol=1e-06, maxfev=500)
print(result)

result = optimize.fsolve(p, 41.0, args=2,3,4, xtol=1e-06, maxfev=500)
print(result)
于 2019-03-13T15:54:40.373 に答える