Ax = b,b依赖于x

时间:2016-10-01 09:59:36

标签: matlab numpy linear-algebra solver linear

我理解如何解决Ax = b,但是如果b依赖于x呢?参见图片E3 =功能(E4)。我想这是迭代完成的。这叫什么问题?我用什么方法来解决它?

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

system sketch

给出以下方程组:

set of equations

通向以下矩阵:

matrix

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

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'定义(非线性)

2 个答案:

答案 0 :(得分:3)

是的,您可以通过非线性优化来解决这个问题。 scipy.optimize包含所有有用的详细信息,但这是一个解决系统假设Dim toDelete As Range For i = endRow To 3 Step -2 If toDelete Is Nothing Then Set toDelete = Rows(i) Else Set toDelete = Union(toDelete, Rows(i)) End If Next toDelete.Delete shift:=xlUp some_function(x)的示例:

x ** 2

所有优化技术基本上都是功能最小化。您提供优化程序

  1. 一个最小化的函数(并且它接受一个向量输入参数并返回一个标量数)和
  2. 关于哪个输入向量产生最小标量的初始猜测。
  3. 优化器返回该函数的输入,产生最小的输出。

    上面的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) 函数正在最小化,它返回objectiveFunction之间的错误,其中A . x - b是候选解决方案,而x的形式取决于b {1}}。

    你可以陷入局部最小值,所以使用优化方法是一种黑色艺术。但这种情况看起来非常简单:上面的代码打印出以下内容:

    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]) x值:请注意fun是一个向量而x是一个标量。这意味着fun。这反过来意味着您正在寻找的答案objectiveFunction(solution.x) == solution.fun(假设b}是some_function,您可以确信这是正确的,因为solution.xsolution.funA . x之间的误差接近于零。

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

答案 1 :(得分:2)

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

  • 一般而言,您无法对解决方案的分发发表任何意见。有一个吗?没有更详细的分析就不可能说。也许有一些,或无限多?使用线性方程组(A*x = b),所有信息都在矩阵中,但非线性方程则不然。

  • 由于非线性求解器无法对解决方案景观的结构做出假设,因此无法保证求解器收敛。事实上,所有非深奥的解算器都只是本地的,即你提供了一个初步的猜测,即关闭"一个解决方案,解算器会将猜测收敛到它。为了保证收敛,在开始之前,您必须对解决方案有一个很好的了解。在实践中,许多人只是随机猜测,让当地的解决方案做了几步,保持手指交叉。

  • 可以说,最受欢迎的本地解算器是牛顿法;它是实现二次收敛的唯一解算器(如果您已经接近解决方案)。在每个步骤中,您需要使用雅可比行列式求解线性方程组,即J*d = -F(x)。如果你不小心这样做,那就足够了。

既然你已经了解了所有这些,就可以使用scipy optimize