2010-03-23 3 views
3

Je continue à obtenir cette erreur dans Matlab:erreur d'indexation de la matrice dans Matlab

tenté d'accéder à r (0,0); L'index doit être un entier positif ou logique.

Erreur dans ==> Romberg à 15

Je l'ai couru avec Romberg(1.3, 2.19,8)

Je pense que le problème est la déclaration n'est pas logique parce que je l'ai fait positif et toujours eu la même erreur. Quelqu'un a-t-il des idées de ce que je pourrais faire?

function Romberg(a, b, n) 
    h = b - a; 
    r = zeros(n,n); 
    for i = 1:n 
     h = h/2; 
     sum1 = 0; 

     for k = 1:2:2^(i) 
      sum1 = sum1 + f(a + k*h); 
     end 

     r(i,0) = (1/2)*r(i-1,0) + (sum1)*h; 

     for j = 1:i 
      r(i,j) = r(i,j-1) + (r(i,j-1) - r(i-1,j-1))/((4^j) - 1); 
     end 
    end 
    disp(r); 
end 

function f_of_x = f(x) 
    f_of_x = sin(x)/x; 
end 

Répondre

6

Il y a deux lignes où vous utilisez 0 à l'index, ce qui vous ne pouvez pas en Matlab:

r(i,0) = (1/2)*r(i-1,0) + (sum1)*h; 

et

r(i,j) = r(i,j-1) + (r(i,j-1) - r(i-1,j-1))/((4^j) - 1); 

lorsque j == 1 ou i == 1.

Je vous suggère d'exécuter vos boucles à partir de 2, et de remplacer respectivement les exposants i et j par (i-1) et (j-1).

En aparté: Vous pouvez écrire la boucle

for k = 1:2:2^(i) 

    sum1 = sum1 + f(a + k*h); 

end 

comme

k = 1:2:2^i; 
tmp = f(a + k*h); 
sum1 = sum(tmp); 

si vous écrivez f_of_x comme

sin(x)./x 
+1

Dans le cas où 'a' est toujours négatif, vous pouvez définir' f (x) 'comme ' f_of_x = sin (x) ./ x; f_of_x (isnan (f_of_x)) = 1; 'Ou' sinc (x/pi) 'fonctionnerait aussi. – mtrw

3

dans Matlab, vecteurs et matrices sont indexés à partir de 1. Par conséquent, la première ligne de votre code est invalide parce que l'index sur r est 0.

+0

Désolé à ce sujet était faute de frappe, je ne voulais pas mettre cette première ligne de code là-bas. –

+0

Néanmoins, la même ligne existe au milieu du bloc de code. Il essaie d'assigner 'r (i, 0)' ce qui est illégal parce que 0 est un index illégal dans la matrice. – Will

1

Vous avez zéro dans les indices

r(i,0) = (1/2)*r(i-1,0) + (sum1)*h; 

Ceci est impossible dans Matlab - tous les indices sous forme de départ 1.

Questions connexes