Sympy nsolve 返回lambdaify TypeErrors

问题描述 投票:0回答:1

我正在尝试使用 Sympy nsolve 以数值方式求解超定义方程组,但我不断收到lambdaify TypeErrors。

import sympy as sp

f25 = 61900.
f50 = 66200.
f75 = 70700.
f90 = 77700.

#mu = sp.Symbol('mu')
#sigma = sp.Symbol('sigma')

mu = sp.var('mu')
sigma = sp.var('sigma')

def f(x):
    f = (1 / sp.sqrt(2 * sp.pi * sp.Pow(sigma,2))) * sp.euler(-1 * (sp.Pow(x - mu,2)) / (2 * sp.Pow(sigma,2)))
    return f

f1 = f(f25) - 0.25
f2 = f(f50) - 0.50
f3 = f(f75) - 0.75
f4 = f(f90) - 0.90

sp.nsolve((f1, f2, f3, f4), (mu, sigma), (66000, 10000))

退货

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
File ~\Anaconda3\lib\site-packages\mpmath\calculus\optimization.py:937, in findroot(ctx, f, x0, solver, tol, verbose, verify, **kwargs)
    936 try:
--> 937     fx = f(*x0)
    938     multidimensional = isinstance(fx, (list, tuple, ctx.matrix))

File <lambdifygenerated-5>:2, in _lambdifygenerated(mu, sigma)
      1 def _lambdifygenerated(mu, sigma):
----> 2     return ImmutableDenseMatrix([[mpf((1, 1, -2, 1)) + (mpf(1)/mpf(2))*sqrt(2)*euler(-mpf((0, 239475625, 3, 28))*(1 - mpf((0, 2384070316472963, -67, 52))*mu)**2/sigma**2)/(sqrt(pi)*sqrt(sigma**2))], [mpf((1, 1, -1, 1)) + (mpf(1)/mpf(2))*sqrt(2)*euler(-mpf((0, 68475625, 5, 27))*(1 - mpf((0, 139325861583909, -63, 47))*mu)**2/sigma**2)/(sqrt(pi)*sqrt(sigma**2))], [mpf((1, 3, -2, 2)) + (mpf(1)/mpf(2))*sqrt(2)*euler(-mpf((0, 312405625, 3, 29))*(1 - mpf((0, 8349304248355101, -69, 53))*mu)**2/sigma**2)/(sqrt(pi)*sqrt(sigma**2))], [mpf((1, 8106479329266893, -53, 53)) + (mpf(1)/mpf(2))*sqrt(2)*euler(-mpf((0, 377330625, 3, 29))*(1 - mpf((0, 3798557338215609, -68, 52))*mu)**2/sigma**2)/(sqrt(pi)*sqrt(sigma**2))]])

File ~\Anaconda3\lib\site-packages\mpmath\ctx_mp_python.py:346, in _constant.__call__(self, prec, dps, rounding)
    345 if dps: prec = dps_to_prec(dps)
--> 346 return self.context.make_mpf(self.func(prec, rounding))

File ~\Anaconda3\lib\site-packages\mpmath\libmp\libelefun.py:116, in def_mpf_constant.<locals>.f(prec, rnd)
    115 wp = prec + 20
--> 116 v = fixed(wp)
    117 if rnd in (round_up, round_ceiling):

File ~\Anaconda3\lib\site-packages\mpmath\libmp\libelefun.py:97, in constant_memo.<locals>.g(prec, **kwargs)
     96 if prec <= memo_prec:
---> 97     return f.memo_val >> (memo_prec-prec)
     98 newprec = int(prec*1.05+10)

TypeError: unsupported operand type(s) for >>: 'int' and 'mpf'

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
Cell In[3], line 24
     21 f3 = f(f75) - 0.75
     22 f4 = f(f90) - 0.90
---> 24 sp.nsolve((f1, f2, f3, f4), (mu, sigma), (66000, 10000))

File ~\Anaconda3\lib\site-packages\sympy\utilities\decorator.py:88, in conserve_mpmath_dps.<locals>.func_wrapper(*args, **kwargs)
     86 dps = mpmath.mp.dps
     87 try:
---> 88     return func(*args, **kwargs)
     89 finally:
     90     mpmath.mp.dps = dps

File ~\Anaconda3\lib\site-packages\sympy\solvers\solvers.py:3000, in nsolve(dict, *args, **kwargs)
   2998 J = lambdify(fargs, J, modules)
   2999 # solve the system numerically
-> 3000 x = findroot(f, x0, J=J, **kwargs)
   3001 if as_dict:
   3002     return [dict(zip(fargs, [sympify(xi) for xi in x]))]

File ~\Anaconda3\lib\site-packages\mpmath\calculus\optimization.py:940, in findroot(ctx, f, x0, solver, tol, verbose, verify, **kwargs)
    938     multidimensional = isinstance(fx, (list, tuple, ctx.matrix))
    939 except TypeError:
--> 940     fx = f(x0[0])
    941     multidimensional = False
    942 if 'multidimensional' in kwargs:

TypeError: _lambdifygenerated() missing 1 required positional argument: 'sigma'

我尝试将变量定义为

sp.Symbol
sp.var

我尝试将变量括起来以求解:

sp.nsolve((f1, f2, f3, f4), [(mu, sigma)], (66000, 10000))
。但这只是给了我一个新的 TypeError:
TypeError: nsolve expected exactly 1 guess vectors, got 2

将我的输入猜测值括起来会产生另一个类型错误:

sp.nsolve((f1, f2, f3, f4), [(mu, sigma)], [(66000, 10000)])
TypeError: cannot create mpf from (66000, 10000)

我确信你可以看出我几乎已经放弃了,并且正在以“猴子和打字机”的方式进行暴力破解。

有人可以提供建议吗?

python python-3.x sympy lambdify
1个回答
0
投票

看看你的

f(x)
,它们似乎是某种正态统计分布。如果是这样,您可能需要将
sp.euler
替换为
sp.E ** 
,其中
sp.E
是欧拉数。

© www.soinside.com 2019 - 2024. All rights reserved.