Date: Oct 20, 2011 12:12 PM
Author: Halley
Subject: Re: Matrix dimensions must agree
"Halley" wrote in message <j7pgmh$egc$1@newscl01ah.mathworks.com>...

> "Matt J" wrote in message <j7pf7q$9b3$1@newscl01ah.mathworks.com>...

> > "Halley" wrote in message <j7pdmt$3o9$1@newscl01ah.mathworks.com>...

> > >

> > > %Calculate old values

> > > rho(i) = (x_a(i,:).*A.*x(:,i))./(x_a(i,:).*B.*x(:,i))

> > ========

> >

> > I suspect you mean to do * instead of .*

> >

> > In any case, the sizes definitely aren't compatible for the .* operation

>

> I think this is the simplest solution, thanks.

I had actually been toying with that solution as I waited for responses when I ran across a new problem. With each iteration my values are not changing. As I mentioned, x(i) should become xnorm(i) and rho(i) should equal rho(i+1). I suspect that this is the problem, that somehow the order of the operations regarding rho is making it so that the relative error doesn't change. I have tried taking rho(i) out of the loop and calculating rho(1) but that did not seem to help either. I've been struggling with these problems for a few days so the help is really appreciated.

%Declare initial variables

A = [2 -1;-1 4];

b = [1;1];

B = [1 0;0 1];

Nmax = 20;

TOL = 1*10^-5;

k = 1;

x = zeros(2,21);

x_a = zeros(21,2);

rho = zeros(21,1);

xnorm = zeros(2,21);

x(:,1) = A\b;

x_a(1,:) = x(:,1)';

for i =1:Nmax

%Calculate old values

rho(i) = (x_a(i,:)*A*x(:,i))/(x_a(i,:)*B*x(:,i))

%Calculate new values

xnorm(:,i) = (1/sqrt(x_a(i,:)*B*x(:,i)))*x(:,i)

rho(i+1) = (x_a(i,:)*A*x(:,i))/(x_a(i,:)*B*x(:,i))

%Check for convergence

relative_error = abs((rho(i+1)-rho(i))/rho(i+1))

if ( relative_error ~= 0 && relative_error <= TOL )

x(:,i+1) = xnorm(:,i)

rho(i+1) = rho(i+1)

k = k

return

elseif (relative_error == 0)

x(:,i) = xnorm(:,i)

rho(i) = rho(i+1)

k = k+1

elseif (relative_error > TOL)

x(:,i) = xnorm(:,i)

rho(i) = rho(i+1)

k = k+1

end

end