Ax=b 其中 b 取决于 x

Ax=b with b dependent on x

我明白Ax=b的解法,但是如果b依赖于x怎么办?参见图片 E3 = function(E4)。我想这是迭代完成的。这样的问题叫什么?我用什么方法解决?

我正在尝试解决以下系统问题:

给出下列方程组:

导致以下矩阵:

更新: 根据要求提供更多信息:

A = ([
[-1, 0, 0, 0, 0],
[1, -1, -1, 0, 0],
[0, 1, 0, -1, 0],
[0, 0, 1, 1, -1],
[0, 0, 1, 0, 0]
])

b = [-10, 0, 1, 1, 3]

print(np.linalg.solve(A, b))

-> [ 10.   7.   3.   6.   8.]

这可行,但如果:

b = [-10, 0, 1, 1, some_function(x[3])]

因此 E3 = some_function(E4),因此 E3 取决于 E4,由 'some_function'(非线性)

定义

是的,你可以用非线性优化来解决这个问题。 scipy.optimize 包含所有有趣的细节,但这里有一个示例可以解决您的系统,假设 some_function(x)x ** 2:

import numpy as np
import scipy.optimize as opt

A = np.array([
    [-1, 0, 0, 0, 0],
    [1, -1, -1, 0, 0],
    [0, 1, 0, -1, 0],
    [0, 0, 1, 1, -1],
    [0, 0, 1, 0, 0.0]
    ])
b = np.array([-10, 0, 1, 1, 3.0]) # last value is fake

def objectiveFunction(x):
    bNew = b.copy()
    bNew[-1] = x[3] ** 2 # "some_function = lambda x: x**2"
    error = np.dot(A, x) - bNew
    return np.dot(error, error)

solution = opt.minimize(objectiveFunction, np.zeros((5)))

print(solution)

所有优化技术基本上都是函数最小化。你优化器

  1. 一个最小化函数(它接受一个向量输入参数和 returns 一个标量)和
  2. 关于哪个输入向量产生最小标量的初步猜测。

优化器returns 生成最小输出的函数的输入。

上面的objectiveFunction函数正在最小化,它returnsA . x - b之间的误差,其中x是候选解,b有依赖于 x.

的形式

您可能会陷入局部极小值,因此使用优化方法有点像魔法。但这种情况看起来非常简单:上面的代码打印出以下内容:

      fun: 1.3591186209050682e-11
 hess_inv: array([[ 0.49698215,  0.08279412,  0.40828859,  0.08067816,  0.47743665],
       [ 0.08279412,  0.39205925, -0.22445874, -0.02791535, -0.26595691],
       [ 0.40828859, -0.22445874,  1.01438679,  0.18492456,  1.19990433],
       [ 0.08067816, -0.02791535,  0.18492456,  0.05283296,  0.23785942],
       [ 0.47743665, -0.26595691,  1.19990433,  0.23785942,  1.94819504]])
      jac: array([ -5.37158676e-06,   4.82585577e-06,   7.97108114e-06,
        -6.31780565e-06,   4.76041890e-07])
  message: 'Optimization terminated successfully.'
     nfev: 105
      nit: 13
     njev: 15
   status: 0
  success: True
        x: array([ 10.00000068,   3.54138098,   6.45862309,   2.54138196,   8.00000528])

这是很多信息,但重要的一点是 xfun 值:请注意 x 是向量而 fun 是标量。这意味着 objectiveFunction(solution.x) == solution.fun。这反过来意味着您正在寻找的答案 b(假设我假设 some_function)是 solution.x,您可以确信这是正确的,因为 solution.funA . xb 之间的误差接近于零。

我跳过了一堆解释,但如果你需要,我可以详细说明。

如果您的 b(x)x 的某个非线性函数,那么在左侧有 A*x 并不重要。该方程最简单的表达方式是 A*x - b(x)=0,换言之 F(x) = 0,一般非线性方程。在尝试解决这个问题之前,请注意一些严重的后果:

  • 总的来说,解决方案的分布你是说不上来的。有没有一个?没有更详细的分析就不可能说。也许有几个,或者无限多?对于线性方程系统 (A*x = b),所有信息都在矩阵中,但对于非线性方程则不然。

  • 由于非线性求解器无法对解决方案景观的结构做出假设,因此无法保证求解器收敛。事实上,所有非深奥的求解器都只是本地的,即,您为解决方案提供 "close" 的初始猜测,求解器会将猜测收敛到它。为了保证收敛,您必须在开始之前就已经对解决方案有一个很好的了解。在实践中,许多人只是随机猜测,让本地求解器执行一些步骤,并保持祈祷。

  • 可以说,最流行的局部求解器是牛顿法;它是唯一实现二次收敛的求解器(如果您已经接近解决方案)。在每一步中,你需要求解一个具有雅可比矩阵的线性方程组,即J*d = -F(x)。如果您不小心,仅此一项就可能会付出相当高的代价。

现在你已经了解了所有这些,你可以尝试 scipy optimize