首页 > 解决方案 > Python 中的 fsolve 函数因“函数调用的结果不是正确的浮点数组”而失败

问题描述

我正在尝试运行一个求解器,它使用 np.array 中的多个值作为常量。我希望它遍历它们,但是每次遍历时,都会给我错误:minpack.error: Result from function call is not a proper array of floats。这是代码:

import numpy as np
from scipy.optimize import fsolve    

G = np.linspace(8,12,3)
a = [5, 3, 7]
b = [10, 4, 5]

def equation1(xy, G):
    ep, uc = xy
    return(2*981*7.62*((ep**-4.7) - 1) - 0.01*(uc/ep - 399)**2,
           (5.34*G - a) - (uc/ep - 399)*7.51*(1 - ep))

EP1 = []
UC1 = []

for i in range(0,len(G)):
    ep1, uc1 = fsolve(equation1, (a[i], b[i]), G[i])
    EP1.append(ep1)
    UC1.append(uc1)

我一直试图找出问题出在哪里,我认为这与函数返回中所说的部分有关 (5.34*G - a)。如果有人可以提供帮助,我将不胜感激。谢谢!顺便说一句,a 和 b 数字是不现实的,因此函数可能无法正确收敛。

标签: pythonnumpymath

解决方案


在 的返回调用中,您引用了超出范围equation1的变量。实际上是一个列表,因此 minpack 抱怨您尝试返回的对象的形状。在我看来,您只是忘记将其交换为. 此外,您应该使用 root 而不是 fsolve,请参见此处。这给出了:aaaep

import numpy as np
from scipy.optimize import root


def func(xy, G):
    ep, uc = xy
    num = 2 * 981 * 7.62
    return (num * (ep ** -4.7 - 1) - 0.01 * (uc / ep - 399) ** 2,
            5.34 * G - ep - (uc / ep - 399) * 7.51 * (1 - ep))


G = np.linspace(8, 12, 3)
a = [5, 3, 7]
b = [10, 4, 5]
EP1 = []
UC1 = []
for i in range(G.size):
    sol = root(func, [a[i], b[i]], args=G[i])
    EP1.append(sol.x[0])
    UC1.append(sol.x[1])
print(EP1, UC1)

推荐阅读