fsolve - 输入与输出不匹配

0 投票
1 回答
2393 浏览
提问于 2025-04-17 22:21

我正在尝试解决一个有三个未知数的过定系统方程。我在MATLAB中使用fsolve和lsqnonlin通过一个for循环调用方程组,成功得到了结果。

但是在Python中使用scipy时,我遇到了以下错误信息:

fsolve: there is a mismatch between the input and output shape of the 'func' argument 'fnz'

下面是我的代码:

from xlrd import open_workbook
import numpy as np
from scipy import optimize
g = [0.5,1,1.5]
wb = open_workbook('EThetaValuesA.xlsx')
sheet=wb.sheet_by_index(0)
y=sheet.col_values(0,1)
t1=sheet.col_values(1,1)
t2=sheet.col_values(2,1)
t3=sheet.col_values(3,1)

def fnz(g):
    i=0
    sol=[0 for i in range(len(t1))]
    x1 = g[0]
    x2 = g[1]
    x3 = g[2]
    print len(t1)
    for i in range(len(t1)):
        # various set of t1,t2 and t3 gives the various eqns
        print i
        sol[i]=x1+t1[i]/(x2*t2[i]+x3*t3[i])-y[i]    
    return sol

Anz = optimize.fsolve(fnz,g)

print Anz

有人能告诉我我哪里出错了吗?非常感谢。

1 个回答

0

这个异常的意思是,调用 fnz() 函数得到的结果和输入的 g 维度不一样。这里的 g 是一个包含3个元素的列表,或者说是一个形状为 (3,) 的数组。

为了更好地说明这个问题,如果我们定义:

def fnz(g):
    return [2,3,5]
Anz = optimize.fsolve(fnz,g)

就不会出现这样的异常。但是这样做会:

def fnz(g):
    return [2,3,4,5]
Anz = optimize.fsolve(fnz,g)

fnz() 得到的结果应该和 t1 的长度相同,而我可以肯定 t1 的长度是超过3个元素的。

撰写回答