我正在解决所谓的 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.
这两种方法都不起作用。
包装清单:
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
有人知道问题出在哪里吗?
您的问题是
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]