2015-05-12 63 views
0

該程序是一個優化的梯度下降。倍頻程索引越界

下面是代碼:

clear all 
    close all 
    [x,y] = meshgrid(-2:0.1:2);            
    z = x.^2 + 100*y.^2;           
    n = 1; 
    k(n)=0.01; 
    arret = 0.0001;               
    mesh(x,y,z);                
    [x1(n),y1(n)] = ginput(1);            
    diff_x(n) = 2*x1(n);             
    diff_y(n) = 200*y1(n);             
    while sqrt(diff_x(n)^2 + diff_y(n)^2) > arret && n < 30 
    k(n) = sqrt(diff_x(n)^2 + diff_y(n)^2)/(8*x1(n).^2+2*10.^6*y1(n).^2);   
    x1(n+1) = x1(n) - k(n)*diff_x(n);          
    y1(n+1) = y1(n) - k(n)*diff_y(n);  
    n = n+1; 
    diff_x(n) = 2*x1(n); 
    diff_y(n) = 200*y1(n); 
    z1(n) = x1(n).^2 + 100*y1(n).^2;          
    plot3(x1(n),y1(n),z1(n));            
    end 

    x1(n) 
    y1(n) 
    n 

所以我就這一點,我不明白爲什麼。

error: GradientPasOptFinal2: A(I): index out of bounds; value 2 out of bound 1

error: called from:

error: error: C:\Octave\octave-3.8.2\GradientPasOptFinal2.m at line 13, column 8

解決:第k(N)Y1之間(n)和n爲理由,我不知道爲什麼,但現在的程序工作,謝謝!

+0

謝謝Doelleri的更正,我很快就寫下來了,英文不是我的母語...... – avers

回答

0

您只定義了k(1)。 k(2)未定義。未來

k(n) = sqrt(diff_x(n)^2 + diff_y(n)^2)/(8*x1(n).^2+2*10.^6*y1(n).^2); 

這些行: 移動此行

x1(n+1) = x1(n) - k(n)*diff_x(n);          
y1(n+1) = y1(n) - k(n)*diff_y(n); 

,它應該工作。

+0

謝謝你的快速回答,我是Octave的新手,但是x1(n)和y1(n )需要k(n)的值,另一方面,k(n)需要x1(n)和y1(n)的值。其他編輯:在這段時間內,計算機是否知道他有k(n)= 0.01,所以他可以計算x1(n + 1)和y1(n + 1),然後他可以計算出k(n + 1) ),然後x1(n + 2)和y1(n + 2).... 我不明白這個問題。 – avers

+0

我仍然堅持,我嘗試了很多事情,它不工作,我不知道該怎麼做。 – avers

+0

謝謝你的時間,我試過了,它不起作用。랬錯誤:GradientPasOptFinal2:A(I):索引超出範圍;值2超出範圍1 錯誤:調用自: 錯誤:C:\ Octave \ octave-3.8.2 \ GradientPasOptFinal2.m在第13行,第8列 我不知道要修復它,第13行8它是diff_x(n),全部被定義,這是非常奇怪的... – avers