Question about error: Subscript indices must either be real positive integers or logicals.

1 view (last 30 days)
Hello all,
I am new to matlab and am currently writing code to solve a system of nonlinear functions using the Newton Raphson method. In my code I am dealing with creating a jacobian and solving using LU factorization.
I am putting this command into the command window which calls for functions from file 'test':
NR_PartA( 'test', [ 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0], 0.00001, 0.0001)
However, I am getting this error:
__Subscript indices must either be real positive integers or logicals.
Error in NR_PartA (line 13) yguess = myfunc(guess); %Initial values for y matrix in forward substitution__
I was wondering if anyone could help me out in solving this problem?
Here is my code:
%Define a function that will read in:
%an m file containing n number of nonlinear functions
%an initial guess for the functions
%A value that will determine if convergence to a solution has occured
%(tolerance)
%The value for iteration for each guess
function K = NR_PartA(myfunc, guess , epsilon, step)
%maxiteration = 100; %define the maximum number of iterations for the function
n = length(guess); %define the number of functions based on the test file input
deltay = zeros(1,n); % delta F for initial Newton Raphson guess
yguess = myfunc(guess); %Initial values for y matrix in forward substitution
initialguess = zeros(1,n);
Jacob = zeros(n,n); %Set up the initial Jacobian Matrix to a matrix of zeros
func = 1; %set func to 1 so that while loop has a valid argument
while func
%Find new value of delta y
for i = 1:1:n
%for number of equations in myfun, set delta y
deltay(i) = initialguess(i) - yguess(i);
end
%Exit loop if delta y has converged to an acceptable tolerance (epsilon)
if abs(deltay) < epsilon
func = 0;
break;
end
%Develop the Jacobian matrix
for i=1:1:n
%Fill in the empty matrix by moving column by column, line by line
for j =1: 1:n
x1 = guess(j);
%set arguments for jacobian elements
xplus = x1 + step;
xminus = x1 - step;
deltax1 = guess;
deltax1(j) = xplus;
deltax2 = guess;
deltax2(j) = xminus;
fguess1 = myfunc(deltax1);
fguess2 = myfunc(deltax2);
guess1 = fguess1(i);
guess2 = fguess2(i);
%Find each element of the jacobian
J = (guess1 - guess2)/ (2*step);
Jacob(i,j) = J;
end
end
%Sparse Jacobian to make function faster
JJ = sparse(Jacob);
[L,U,P] = lu(JJ); %define lower and upper matrixes for LU factorization
b = deltay;
c = zeros(n,1);
b = deltay*P;
%forward substitution
for i=1:n
c(i)= (b(i)-L(i, :)*c)/L(i,i);
end
%set a matrix of zeros for new guess
newguess = zeros(n,1);
%backward substitution
for i=n:-1:1
newguess(i) = (c(i)-U(i,:)*newguess)/U(i,i);
guess(i) = guess(i) + newguess(i);
end
yguess = myfunc(guess);
end
%Output the value of the variables after convergence has occured
K = guess;
end
Sorry if I am missing information for you guys. Let me know if you need anything else.
Thank you for your time.

Accepted Answer

Guillaume
Guillaume on 25 Feb 2015
double [0 1 0 1 0 ...] is not the same as logical [0 1 0 1 0 ....], assuming you were intending to pass logical to your function, you'll have to declare your array as such:
NR_PartA( 'test', logical([1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0]), 0.00001, 0.0001)
Or use true and false instead of 0, 1 in your array.

More Answers (2)

Image Analyst
Image Analyst on 25 Feb 2015

Kody Haugli
Kody Haugli on 26 Feb 2015
Now I am getting this error:
Undefined function 'NR_PartA' for input arguments of type 'char'.
I'm assuming it has something to do with the fact that in my code, my function call doesn't include the numbers found in my command window. Is this correct?

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!