首页 > 解决方案 > 有效计算多参数函数的根的问题

问题描述

你好,我亲爱的互联网上的聪明人,

我想使用 scipy.optimize.fsolve 计算给定间隔内(不可逆)两个参数函数的根:

kappa = 1.4

def Av_ma(Ma):
    Ma[np.where(Ma < 0)] = 0
    return Ma * ((2 + (kappa - 1) * (Ma ** 2)) / (kappa + 1)) ** ((kappa + 1) / (2 * (1 - kappa)))


def Av_ma_root(Ma, _Av_e_2):
    return Av_ma(Ma) - _Av_e_2

实际的函数 Av_ma 只有一个参数,但我想计算 0 到 1 之间的 _Av_e_2 值的根。因此,我想要一个仅包含 100 个 _Av_e_2 值的根集的数组。到目前为止,这就是我的代码的样子:

Av_e_2 = np.arange(0, 1 + 1e-12, 0.01)
x0 = np.arange(0.1, 1, 0.1)
    
startvec = np.repeat(x0, len(Av_e_2))
lAv_e_2 = np.tile(Av_e_2, np.shape(x0)[0])
pv2 = optimize.fsolve(Av_ma_root, startvec, args=lAv_e_2)
pv2 = np.reshape(pv2, (len(x0), len(Av_e_2)))
pv2 = np.round(pv2, 6)
pv2 = np.array([np.unique(p) for p in np.transpose(pv2)])
print(pv2)

我用 Av_e_2 的长度定义了一个“起始估计”数组的数组。它用于为 fsolve 的每个 Av_e_2 值提供相同的起始估计值。

在我定义了一个 Av_e_2 值的数组之后。它用于给 fsolve Av_e_2 的每个值

优化后,我重塑、舍入并丢弃非唯一值。

简而言之:我的代码不起作用。它不会产生我想要的解决方案

test_vec_opt.py:25: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.

pv2 = np.array([np.unique(p) for p in np.transpose(pv2)])

标签: pythonnumpyoptimizationscipy

解决方案


推荐阅读