fsolve(scipy)导致 ValueError

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

我正在解决所谓的 Blasius 问题。 我使用以下代码(从 youtube lecutre https://www.youtube.com/watch?v=0L4h-hqZY2Y 复制,时间码:8:35):

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from scipy.optimize import fsolve
from scipy.optimize import root
from scipy.optimize import root_scalar

eta = np.linspace(0, 10, 101)

def blas(f, t):
    return (f[1], f[2], -(1/2)*f[2]*f[0])

def blas0(x, ts):
    f0 = (0., 0., x)
    f = odeint(blas, f0, ts)
    return 1.-f[-1, 1]

print(blas0(0.0, eta))
print(blas0(0.1, eta))
print(blas0(0.2, eta))
print(blas0(0.332, eta))
print(eta)

xpp0 = fsolve(blas0, x0=0.1, args=(eta), xtol=1e-6)

所有列出的打印功能都运行良好并打印正确的结果。 但是,函数 fsolve 会导致以下错误:

xpp0 = fsolve(blas0, x0=0.1, args=(eta), xtol=1e-6)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
ValueError: setting an array element with a sequence. The requested 
array has an inhomogeneous shape after 1 dimensions. The detected 
shape was (3,) + inhomogeneous part.
  • 我尝试降级 numpy 和 scipy 软件包。
  • 我尝试在 eta 的定义中添加 dtype=object 。
  • 我尝试使用函数 root 而不是 fsolve。
  • 我尝试使用此处(或在谷歌中)找到的其他解决方案。

这两种方法都不起作用。

包装清单:

Package         Version
--------------- -----------
contourpy       1.3.0
CoolProp        6.6.0
cycler          0.12.1
fonttools       4.53.1
kiwisolver      1.4.7
matplotlib      3.9.2
numpy           2.1.1
packaging       24.1
pandas          2.2.2
pillow          10.4.0
pip             24.2
pyparsing       3.1.4
PyQt6           6.7.1
PyQt6-Qt6       6.7.2
PyQt6_sip       13.8.0
python-dateutil 2.9.0.post0
pytz            2024.2
scipy           1.14.1
six             1.16.0
tzdata          2024.1

有人知道问题出在哪里吗?

python numpy scipy valueerror fsolve
1个回答
0
投票

您的问题是

fsolve
需要
x0
的序列,并且当传递数字时它会默默地转换 a 序列。

您可以通过从

x
 中的 
blas0

中拉出第一个元素来解决此问题
def blas0(x, ts):
    x = list(x)[0]
    f0 = (0., 0., x)
    f = odeint(blas, f0, ts)
    return 1.-f[-1, 1]
© www.soinside.com 2019 - 2024. All rights reserved.