fsolve - mismatch between input and output

2019-09-03 08:48发布

I'm trying to solve an overdetmined system of equations with three unknowns. I'm able to get solution with fsolve and lsqnonlin in MATLAB by calling the system of equations through a for loop.

But in python using scipy, I'm getting the following error message:

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

The code is given below:

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

Could anyone please suggest where I'm wrong? Thank you in advance.

1条回答
够拽才男人
2楼-- · 2019-09-03 09:08

The exception means that the result from fnz() function call does not has the same dimension as the input g, which is a list of 3 elements, or can be seen as an array of shape (3,).

To illustrate the problem, if we define:

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

There will not be such an exception. But this will:

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

The result from fnz() should have the same length as t1, which I am sure is longer than 3 elements.

查看更多
登录 后发表回答