Python 使用'fsolve'求解具有n个未知量的m方程,其中n<;M

Python 使用'fsolve'求解具有n个未知量的m方程,其中n<;M,python,mathematical-optimization,Python,Mathematical Optimization,假设我有两个方程,其中一个未知,我想用fsolve来解它: 0 = 0.5*x[0]**2-2 0 = 2-x 答案显然是x=2。我试过这个 import numpy as np; from scipy.optimize import fsolve def f(x): r = np.zeros(2) r[0] = 0.5*x[0]**2-2 r[1] = 2-x[0] return r fsolve(f,[0.5]) 错误消息是“函数返回的数组在调用之

假设我有两个方程,其中一个未知,我想用
fsolve
来解它:

0 = 0.5*x[0]**2-2
0 = 2-x
答案显然是
x=2
。我试过这个

import numpy as np; from scipy.optimize import fsolve
def f(x):
    r  = np.zeros(2)
    r[0] =  0.5*x[0]**2-2
    r[1] = 2-x[0]

    return r

fsolve(f,[0.5])
错误消息是“函数返回的数组在调用之间的大小发生了更改”

我看不出这里出了什么问题。我如何解决这个问题

一般来说,当变量的数量小于方程的数量时,如何求解方程

这是完整的信息

Traceback (most recent call last):

  File "<ipython-input-37-e4f77791f3f6>", line 12, in <module>
    fsolve(f,[0.5])

  File "... anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 148, in fsolve
    res = _root_hybr(func, x0, args, jac=fprime, **options)

  File ".... /anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 227, in _root_hybr
    ml, mu, epsfcn, factor, diag)

ValueError: The array returned by a function changed size between calls
回溯(最近一次呼叫最后一次):
文件“”,第12行,在
fsolve(f[0.5])
文件“…anaconda3/lib/python3.7/site packages/scipy/optimize/minpack.py”,第148行,在fsolve中
res=\u root\u hybr(func,x0,args,jac=fprime,**选项)
文件“…/anaconda3/lib/python3.7/site packages/scipy/optimize/minpack.py”,第227行,在根目录下
ml,mu,epsfcn,因子,diag)
ValueError:函数返回的数组在调用之间更改了大小

对于超定系统(方程式的数量大于变量的数量),您需要使用,例如,最小二乘法。在这种情况下,通常没有传统意义上的解决方案。我们需要定义,我们应该将什么视为系统的解决方案

让您有一个由两个方程和一个标量变量组成的系统:

f(x)=0 g(x)=0

该系统通常不一致,在传统意义上没有解决方案

让我们将一些值eps1和eps2添加到系统的右侧部分:

f(x)=0+eps1 g(x)=0+eps2

eps1和eps2是一些值

现在,让我们找到这样的
x
,当
eps1^2+eps2^2
增加其最小值时;这将是系统的解决方案 在最小二乘意义上

要使用scipy获得这样的解决方案,可以使用函数

让我们看一下下面的代码,它解决了您的方程组:

import numpy as np
from scipy.optimize import fsolve, least_squares
def f(x):
    r  = np.zeros(2)
    r[0] =  0.5*x**2-2
    r[1] = 2-x

    return r

least_squares(f, [0.0])
结果:

active_mask: array([0.])
        cost: 5.175333019854869e-20
         fun: array([ 2.87759150e-10, -1.43879575e-10])
        grad: array([7.19397879e-10])
         jac: array([[ 2.00000001],
       [-1.        ]])
     message: '`gtol` termination condition is satisfied.'
        nfev: 6
        njev: 6
  optimality: 7.193978788924559e-10
      status: 1
     success: True
           x: array([2.])