導航:首頁 > 源碼編譯 > 非線性cg演算法

非線性cg演算法

發布時間:2023-08-20 06:27:03

❶ matlab解非線性方程組

1. fsolve
求解非線性方程組
方程:
F(x)=0
x是一個向量,F(x)是該向量的函數向量,返迴向量值
2. 語法
x = fsolve(fun,x0)
x = fsolve(fun,x0,options)
[x,fval] = fsolve(fun,x0)
[x,fval,exitflag] = fsolve(...)
[x,fval,exitflag,output] = fsolve(...)
[x,fval,exitflag,output,jacobian] = fsolve(...)
3. 描述
fsolve用於尋找非線性系統方程組的零點。
x = fsolve(fun,x0)以x0為初始值,努力尋找在fun中描述的方程組。
x = fsolve(fun,x0,options) 以x0為初始值,按照指定的優化設置「options」努力尋找在fun中描述的方程組。使用optimset設置這些選項。
[x,fval] = fsolve(fun,x0)返回在解x處的目標函數fun的值
[x,fval,exitflag] = fsolve(...)返回exitflag表示退出條件。
[x,fval,exitflag,output] = fsolve(...)返回output結構,該結構包含了優化信息。
[x,fval,exitflag,output,jacobian] = fsolve(...)返回在解x處的Jacobian函數。
4. 輸入參數
4.1. fun
非線性系統方程。它是一個函數,以x作為輸入,返迴向量F。函數fun可以被指定為一個M文件函數的函數句柄。
x = fsolve(@myfun,x0)
這里的myfun是一個matlab函數,形如:
function F = myfun(x)
F = ... % Compute function values at x
fun也可以是一個非同步函數的函數句柄:
x = fsolve(@(x)sin(x.*x),x0);
若用戶定義的值為矩陣,則會被自動轉換為向量。
若Jacobian能被計算出來且通過options = optimset('Jacobian','on')設置Jacobian選項為」on」,則函數fun必須在第2個輸出參數中返回x處的Jacobian值J(它是一個矩陣)。注意:通過檢查nargout的值,當fun被只帶一個輸出參數調用的情況下,該函數可避免計算J,僅只有一個輸出參數。(這種情況下,優化演算法僅需要知道F而不需J)。
function [F,J] = myfun(x)
F = ... % objective function values at x
if nargout > 1 % two output arguments
J = ... % Jacobian of the function evaluated at x
end
4.2. options
提供該函數有關的特定信息。
5. 輸出參數
5.1. exitflag
一個用來表示演算法終止原因的整數。
1:函數收斂到x
2:x的變化已經處在容許范圍內
3:殘差變化已經處在容許范圍內
4:搜索方向飛幅度比指定的誤差小
5:迭代次數超過options.MaxIter或函數估值的次數超過options.FunEvals
-1:演算法被輸出函數終止
-2:演算法似乎收斂到一個非根點。
-3:可信半徑變得太小
-4:沿當前方向的線性搜索不能足夠地減小殘差
5.2. output
包含關於優化信息的一個結構,其具有如下欄位:
iterations:已經迭代的次數
funcCount:函數估值的次數
algorithm:所使用的演算法
cgiterations:PCG迭代次數(僅適用於大規模演算法)
stepsize:最終採取的步長(僅適用於中等規模演算法)
firstorderopt:第1階優化的觀測值 。
5.3. options
優化設置。一些選項設置用於所有演算法,部分與大規模演算法(large-scale algrithm)。相關,部分與中等規模演算法相關。可以使用optimset改變其中的設置。LargeScale選項指定使用哪種演算法。
設為『on』使用大規模演算法,設為『off』使用中等規模演算法。
5.3.1. Medium-Scale and Large-Scale Algorithms
如下選項用於大規模和中等規模演算法:
DerivativeCheck:將用戶提供導數與有限差分導數相比較
Diagnostics:顯示被解函數的診斷信息
DiffMaxChange:有限差分變數中的最大變化
DiffMinChange:有限差分變數中的最小變化
Display:顯示的級別,『off『不顯示輸出,』iter『顯示每一步迭代的輸出,』final『顯示最終的輸出(默認)
FunValCheck:檢查目標函數值是否有效。設為『on』,當函數返回值為復數、inf或NaN將返回一個錯誤,設為『off』將不顯示錯誤。
Jacobian:設為『ON』,fsolve將使用用戶定義的Jacobian或Jacobian信息來估值目標函數,若設為『off』,則使用有限差分逼近Jacobian。
MaxFunEvals:最大允許估值次數
MaxIter:最大迭代次數
OutputFcn:指定一個或多個輸出函數,優化函數在每一個迭代過程中將調用這些函數。
PlotFcns:演算法執行時顯示進度條。從預定義中選擇或自定義進度條。指定@optimplotx顯示當前的點,@optimplotfunccount列印出函數的計數,@optimplotfval列印出函數值,@optimplotresnorm列印出殘差范數,@optimplotstepsize列印出步長,@optimplotfirstorderopt列印優化參數的第1階。
TolFun:函數值的終止誤差。
TolX:x的終止誤差
5.3.2. 僅適用於Large-Scale Algorithm
JacobMult:Jacobian乘法函數的函數句柄
JacobPattern
MaxPCGIter
PrecondBandWidth
TolPCG
5.3.3. 僅適用於Medium-Scale Algorithm
NonlEqnAlgorithm:
'dogleg' — Trust-region dogleg algorithm
(default)
'lm' — Levenberg-Marquardt
'gn' — Gauss-Newton
LineSearchType:'lm' (Levenberg-Marquardt)
'gn' (Gauss-Netwton) algorithms.

6. 使用優化工具箱完成以上函數操作
命令:optimtool

❷ Python怎麼做最優化

一、概觀
scipy中的optimize子包中提供了常用的最優化演算法函數實現。我們可以直接調用這些函數完成我們的優化問題。optimize中函數最典型的特點就是能夠從函數名稱上看出是使用了什麼演算法。下面optimize包中函數的概覽:
1.非線性最優化
fmin -- 簡單Nelder-Mead演算法
fmin_powell -- 改進型Powell法
fmin_bfgs -- 擬Newton法
fmin_cg -- 非線性共軛梯度法
fmin_ncg -- 線性搜索Newton共軛梯度法
leastsq -- 最小二乘
2.有約束的多元函數問題
fmin_l_bfgs_b ---使用L-BFGS-B演算法
fmin_tnc ---梯度信息
fmin_cobyla ---線性逼近
fmin_slsqp ---序列最小二乘法
nnls ---解|| Ax - b ||_2 for x>=0
3.全局優化
anneal ---模擬退火演算法
brute --強力法
4.標量函數
fminbound
brent
golden
bracket
5.擬合
curve_fit-- 使用非線性最小二乘法擬合
6.標量函數求根
brentq ---classic Brent (1973)
brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出這個演算法的人名
bisect ---二分法
newton ---牛頓法
fixed_point
7.多維函數求根
fsolve ---通用
broyden1 ---Broyden』s first Jacobian approximation.
broyden2 ---Broyden』s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixing
excitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.實用函數
line_search ---找到滿足強Wolfe的alpha值
check_grad ---通過和前向有限差分逼近比較檢查梯度函數的正確性二、實戰非線性最優化
fmin完整的調用形式是:
fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不過我們最常使用的就是前兩個參數。一個描述優化問題的函數以及初值。後面的那些參數我們也很容易理解。如果您能用到,請自己研究。下面研究一個最簡單的問題,來感受這個函數的使用方法:f(x)=x**2-4*x+8,我們知道,這個函數的最小值是4,在x=2的時候取到。
from scipy.optimize import fmin #引入優化包def myfunc(x):
return x**2-4*x+8 #定義函數
x0 = [1.3] #猜一個初值
xopt = fmin(myfunc, x0) #求解
print xopt #列印結果
運行之後,給出的結果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
程序准確的計算得出了最小值,不過最小值點並不是嚴格的2,這應該是由二進制機器編碼誤差造成的。
除了fmin_ncg必須提供梯度信息外,其他幾個函數的調用大同小異,完全類似。我們不妨做一個對比:
from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):
return x**2-4*x+8
x0 = [1.3]
xopt1 = fmin(myfunc, x0)
print xopt1
print
xopt2 = fmin_powell(myfunc, x0)
print xopt2
print
xopt3 = fmin_bfgs(myfunc, x0)
print xopt3
print
xopt4 = fmin_cg(myfunc,x0)
print xopt4
給出的結果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 53
1.99999999997
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 12
Gradient evaluations: 4
[ 2.00000001]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 15
Gradient evaluations: 5
[ 2.]
我們可以根據給出的消息直觀的判斷演算法的執行情況。每一種演算法數學上的問題,請自己看書學習。個人感覺,如果不是純研究數學的工作,沒必要搞清楚那些推導以及定理雲雲。不過,必須了解每一種演算法的優劣以及能力所及。在使用的時候,不妨多種演算法都使用一下,看看效果分別如何,同時,還可以互相印證演算法失效的問題。
在from scipy.optimize import fmin之後,就可以使用help(fmin)來查看fmin的幫助信息了。幫助信息中沒有例子,但是給出了每一個參數的含義說明,這是調用函數時候的最有價值參考。
源碼研究癖好的,或者當你需要改進這些已經實現的演算法的時候,可能需要查看optimize中的每種演算法的源代碼。在這里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聰明的你肯定發現了,順著這個鏈接往上一級、再往上一級,你會找到scipy的幾乎所有源碼!

閱讀全文

與非線性cg演算法相關的資料

熱點內容
項目經理叫醒程序員 瀏覽:342
autocad旋轉命令 瀏覽:660
手機版wpsoffice怎麼打包文件夾 瀏覽:579
在成都學車用什麼app 瀏覽:818
grep命令管道 瀏覽:426
java修改重啟 瀏覽:567
單片機供電方案 瀏覽:770
airpodspro一代怎麼連接安卓 瀏覽:218
豌豆莢app上有什麼游戲 瀏覽:283
公路商店app標簽選什麼 瀏覽:338
linuxoracle命令行登錄 瀏覽:227
android深度休眠 瀏覽:172
php微信開發例子 瀏覽:845
醫得app登錄密碼是什麼 瀏覽:142
spring開發伺服器地址 瀏覽:411
伺服器上如何查看伺服器的埠 瀏覽:678
單片機伺服器編譯 瀏覽:770
單口usb列印機伺服器是什麼 瀏覽:859
戰地五開伺服器要什麼條件 瀏覽:956
在word中壓縮圖片大小 瀏覽:255