我理解如何解决Ax = b,但是如果b依赖于x呢?参见图片E3 =功能(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'定义(非线性)
答案 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
所有优化技术基本上都是功能最小化。您提供优化程序
优化器返回该函数的输入,产生最小的输出。
上面的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.x
( solution.fun
和A . 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。