2016-10-01 106 views
1

我知道如何求解Ax = b,但是如果b依賴於x,該怎麼辦?見圖E3 =功能(E4)。我想這是迭代完成的。這個問題叫什麼?我用什麼方法來解決它?Ax = b,b取決於x

我試圖解決以下系統:

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'(非線性)

+1

您的問題中缺少大量信息(箭頭在流程圖中表示什麼?* f *?)。你能否以numpy數組的形式給出一些示例輸入?它看起來不像線性系統('Ax = b')。 –

+0

@ali_m我更新了這個問題,希望它能說清楚 – Gilbert

+0

我猜想它不是一個線性系統,所以叫做什麼。我並不想解決問題,我想了解它是一個什麼樣的問題 – Gilbert

回答

3

是的,你可以用非線性優化來解決這個問題。 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。你優化

  1. 函數以最小化(並需要一個矢量輸入參數,並返回一個標量數)和
  2. 哪個輸入向量產生最小標量的初始猜測。

返回輸入到產生最小輸出功能優化。

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]) 

這是很多的信息,但最重要的一點是xfun值:注意如何x是一個載體,fun是標。這意味着objectiveFunction(solution.x) == solution.fun。這又意味着您正在尋找的答案b(給定我的假設some_function)爲solution.x,並且您可以確信這是正確的,因爲solution.funA . xb之間的錯誤)接近於零。

我跳過了一堆解釋,但我可以詳細說明您是否需要。

+0

謝謝艾哈邁德法西,所以這基本上是一個迭代器的線性系統? – Gilbert

+1

@Gilbert對不起,我說錯了:是的,它是一個軟件術語和數學術語中的「迭代器」,但將它想象爲迭代「朝向」一些線性化系統是不正確的。它迭代到均方誤差函數的(局部)最小值。那有意義嗎? –

+0

是的謝謝@Ahmed – Gilbert

2

如果您的b(x)x的某種非線性函數,那麼在左邊您有A*x並不重要。表達方程式的最簡單方法是A*x - b(x)=0,換句話說是F(x) = 0,即一般的非線性方程。之前甚至試圖解決這個問題,要注意的一些討厭的後果:

  • 一般情況下,你不能說解決方案的分銷東西。有沒有一個?沒有更詳細的分析就無法說出。也許有一些,或無限多?使用線性方程系統(A*x = b),所有信息都在矩陣中,但對於非線性方程則不然。

  • 由於非線性求解器不能對解決方案的景觀結構假設,沒有求解保證收斂。事實上,所有非深奧的解算器都只是局部的,也就是說,你提供的初始猜測與解決方案「接近」,解算器將會把這個猜測集中到它上面。爲確保融合,在開始之前,您必須對解決方案有一個很好的瞭解。在實踐中,許多人只是隨機猜測,讓本地求解器做了幾個步驟,保持他們的手指交叉。

  • 可以說,最流行的本地求解器是牛頓法;它是實現二次收斂的唯一解算器(如果您已經接近解決方案)。在每一步中,都需要用雅可比矩陣求解線性方程組,即J*d = -F(x)。如果你不仔細做這件事,那麼這本身可能會非常昂貴。

既然你知道這一切,你可以玩scipy optimize

+0

我的感謝Nico!這使我指出了正確的方向 – Gilbert

相關問題