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)
所有优化技术基本上都是函数最小化。你给优化器
- 一个最小化函数(它接受一个向量输入参数和 returns 一个标量)和
- 关于哪个输入向量产生最小标量的初步猜测。
优化器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])
这是很多信息,但重要的一点是 x
和 fun
值:请注意 x
是向量而 fun
是标量。这意味着 objectiveFunction(solution.x) == solution.fun
。这反过来意味着您正在寻找的答案 b
(假设我假设 some_function
)是 solution.x
,您可以确信这是正确的,因为 solution.fun
( A . x
和 b
之间的误差接近于零。
我跳过了一堆解释,但如果你需要,我可以详细说明。
如果您的 b(x)
是 x
的某个非线性函数,那么在左侧有 A*x
并不重要。该方程最简单的表达方式是 A*x - b(x)=0
,换言之 F(x) = 0
,一般非线性方程。在尝试解决这个问题之前,请注意一些严重的后果:
总的来说,解决方案的分布你是说不上来的。有没有一个?没有更详细的分析就不可能说。也许有几个,或者无限多?对于线性方程系统 (A*x = b
),所有信息都在矩阵中,但对于非线性方程则不然。
由于非线性求解器无法对解决方案景观的结构做出假设,因此无法保证求解器收敛。事实上,所有非深奥的求解器都只是本地的,即,您为解决方案提供 "close" 的初始猜测,求解器会将猜测收敛到它。为了保证收敛,您必须在开始之前就已经对解决方案有一个很好的了解。在实践中,许多人只是随机猜测,让本地求解器执行一些步骤,并保持祈祷。
可以说,最流行的局部求解器是牛顿法;它是唯一实现二次收敛的求解器(如果您已经接近解决方案)。在每一步中,你需要求解一个具有雅可比矩阵的线性方程组,即J*d = -F(x)
。如果您不小心,仅此一项就可能会付出相当高的代价。
现在你已经了解了所有这些,你可以尝试 scipy optimize。
我明白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)
所有优化技术基本上都是函数最小化。你给优化器
- 一个最小化函数(它接受一个向量输入参数和 returns 一个标量)和
- 关于哪个输入向量产生最小标量的初步猜测。
优化器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])
这是很多信息,但重要的一点是 x
和 fun
值:请注意 x
是向量而 fun
是标量。这意味着 objectiveFunction(solution.x) == solution.fun
。这反过来意味着您正在寻找的答案 b
(假设我假设 some_function
)是 solution.x
,您可以确信这是正确的,因为 solution.fun
( A . x
和 b
之间的误差接近于零。
我跳过了一堆解释,但如果你需要,我可以详细说明。
如果您的 b(x)
是 x
的某个非线性函数,那么在左侧有 A*x
并不重要。该方程最简单的表达方式是 A*x - b(x)=0
,换言之 F(x) = 0
,一般非线性方程。在尝试解决这个问题之前,请注意一些严重的后果:
总的来说,解决方案的分布你是说不上来的。有没有一个?没有更详细的分析就不可能说。也许有几个,或者无限多?对于线性方程系统 (
A*x = b
),所有信息都在矩阵中,但对于非线性方程则不然。由于非线性求解器无法对解决方案景观的结构做出假设,因此无法保证求解器收敛。事实上,所有非深奥的求解器都只是本地的,即,您为解决方案提供 "close" 的初始猜测,求解器会将猜测收敛到它。为了保证收敛,您必须在开始之前就已经对解决方案有一个很好的了解。在实践中,许多人只是随机猜测,让本地求解器执行一些步骤,并保持祈祷。
可以说,最流行的局部求解器是牛顿法;它是唯一实现二次收敛的求解器(如果您已经接近解决方案)。在每一步中,你需要求解一个具有雅可比矩阵的线性方程组,即
J*d = -F(x)
。如果您不小心,仅此一项就可能会付出相当高的代价。
现在你已经了解了所有这些,你可以尝试 scipy optimize。