數值雅克比本質就是對函式的每一維分別做數值微分,再組合為雅克比矩陣即可。
通常我們做最優化的時候要計算函式的雅克比矩陣,但是如果函式的解析式比較複雜,求其偏導解析解會非常麻煩。
雖然可以利用mathematica或者matlab的符號運算進行求解,不過有時候得到的解析解也是很複雜的,再轉寫成**如果錯乙個符號很可能就找不到錯誤**了。
利用數值方法求偏導,得到雅克比矩陣,在進行優化求解,通常可以簡化整個過程。
下面用之前文章中高斯牛頓法優化作為例子,來實踐一下如何計算數值雅克比。
matlab**如下:
clear all;close all;clc;結果如下:epsilon = 1e-6
;epsilon_inv = 1/epsilon;
a=1;b=2;c=1; %待求解的係數
x = (0:0.01:1)'
;w = rand(length(x),1)*2-1; %生成雜訊
y = exp(a*x.^2+b*x+c) + w; %帶雜訊的模型
plot(x,y,'.
')pre=rand(3,1); %步驟1
for i=1:100
f0 = exp(pre(1)*x.^2+pre(2)*x+pre(3
)); g = y - f0; %步驟2中的誤差
%數值計算雅克比
for k = 1
:length(pre)
x_ =pre;
x_(k) = pre(k) +epsilon;
jac(:, k) = (exp(x_(1)*x.^2+x_(2)*x+x_(3)) - f0) .*epsilon_inv;
endj =jac;
delta = inv(j'
*j)*j
'* g; %步驟3,inv(j'
*j)*j
'為h的逆
pcur = pre+delta; %步驟4
if norm(delta) <1e-16
break
;
endpre =pcur;
endhold on;
plot(x,exp(a*x.^2+b*x+c),'r'
);plot(x,exp(pre(
1)*x.^2+pre(2)*x+pre(3)),'g'
);%比較一下
[a b c]
pre'
matlab練習程式(DBSCAN)
和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...
matlab練習程式(c c 呼叫matlab)
就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...
matlab練習程式(高階常微分方程組數值解)
這裡以三元二次常微分方程組做乙個例子,更多元更高次的都類似。比如下列方程組 x x x y z y y y x z z z x matlab 如下 main.m clear all close all clc t,x ode45 testfun 0 0.1 5 1 1 1 10.5 0 0 0.1 ...