2015-05-12 61 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