是的,你可以用非線性優化來解決這個問題。 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)
所有優化技術基本功能minimizations。你給優化
- 函數以最小化(並需要一個矢量輸入參數,並返回一個標量數)和
- 哪個輸入向量產生最小標量的初始猜測。
返回輸入到產生最小輸出功能優化。
的objectiveFunction
函數以上被最小化,並且將其返回A . 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
之間的錯誤)接近於零。
我跳過了一堆解釋,但我可以詳細說明您是否需要。
您的問題中缺少大量信息(箭頭在流程圖中表示什麼?* f *?)。你能否以numpy數組的形式給出一些示例輸入?它看起來不像線性系統('Ax = b')。 –
@ali_m我更新了這個問題,希望它能說清楚 – Gilbert
我猜想它不是一個線性系統,所以叫做什麼。我並不想解決問題,我想了解它是一個什麼樣的問題 – Gilbert