matlab練習程式(數值雅克比)

2022-09-20 02:15:15 字數 1403 閱讀 9367

數值雅克比本質就是對函式的每一維分別做數值微分,再組合為雅克比矩陣即可。

通常我們做最優化的時候要計算函式的雅克比矩陣,但是如果函式的解析式比較複雜,求其偏導解析解會非常麻煩。

雖然可以利用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 ...