How to solve the error "Index in position 2 exceeds array bounds."
이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
이전 댓글 표시
Hi, I'm running a code and I keep getting this error
'Index in position 2 exceeds array bounds'
How do i fix it please, The corona virus has really restricted my movement
댓글 수: 2
We would need to see your code. If it reads in files, we would need the files as well.
Rita Akonobi
2020년 3월 19일
편집: Ameer Hamza
2020년 3월 19일
The full error it shows is below
>> truss2D_optimization ('buckling_check_1.txt')
Index in position 2 exceeds array bounds.
Error in truss2D_readdata (line 102)
loadednodes=pload(:,1);
Error in truss2D_optimization (line 19)
[coorddofvar0,fixeddata] = truss2D_readdata(filename);
The main code is
%**********************************************************************
% Program for optimization of linear elastic 2D trusses
%
% HISTORY
% September 2017, : Initial coding as "truss2D.m"
% October 2018, : Changes to turn into truss
% optimization program
%***********************************************************************
function [] = truss2D_optimization(filename)
%
global fixeddata
global R
global U
%
hold off;
%
% Read problem data from input data file (including a design)
%
[coorddofvar0,fixeddata] = truss2D_readdata(filename);
% set number of design variables
nvar=length(coorddofvar0);
%
% Print objective function and constraint array for data file design
%
%...objective function
[objfunction] = truss2D_objfunction(coorddofvar0);
disp('-------------------------------------------------------------------')
disp(' 2D TRUSS OPTIMISER')
disp('-------------------------------------------------------------------')
disp('DATA FILE DESIGN:')
aa=['Objective function = ',num2str(objfunction)];
disp(aa);
%...constraint array value for data file design
[C,Ceq] = truss2D_nlcon(coorddofvar0);
disp('Inequality constraint array =');
disp(C);
%
%
% Perform optimisation
%
% Set bounds for population using data file prescriptions
%...lower bounds for variable nodal coordinates
lowerbound=fixeddata.lowerbound;
%...upper bound;
upperbound=fixeddata.upperbound;
% Set other parameters of function ga
A=[];b=[];Aeq=[];beq=[];
% Call optimisation function
coorddofvaropt = ga(@truss2D_objfunction,nvar,A,b,Aeq,beq,lowerbound,upperbound,@truss2D_nlcon);
%
% Print objective funstion and constraint array for optimal design
[objfunction] = truss2D_objfunction(coorddofvaropt);
disp('-------------------------------------------------------------------')
disp('OPTIMAL DESIGN:')
aa=['Objective function = ',num2str(objfunction)];
disp(aa);
%...constraint array
[C,Ceq] = truss2D_nlcon(coorddofvaropt);
disp('Inequality constraint array =');
disp(C);
disp('-------------------------------------------------------------------')
disp('-------------------------------------------------------------------')
%
%
%
% Plot data file design and optimal design
%
amplfact=fixeddata.amplfact;
coorddoffix=fixeddata.coorddoffix;
dofcoordfix=fixeddata.dofcoordfix;
dofcoordvar=fixeddata.dofcoordvar;
F=fixeddata.F;
lnods=fixeddata.lnods;
ngdof=fixeddata.ngdof;
npoin=fixeddata.npoin;
% Arrange coordinates in usual 2-dimensional array format (node by node)
%...optimal design coordinates
coorddof(dofcoordfix)=coorddoffix;coorddof(dofcoordvar)=coorddofvaropt;
%...initial design coordinates
coorddof0(dofcoordfix)=coorddoffix;coorddof0(dofcoordvar)=coorddofvar0;
%...conversion to 2-dimensional arrays
coord=zeros(npoin,2);coord0=zeros(npoin,2);
for ipoin=1:npoin
dofx=ipoin*2-1;dofy=ipoin*2;
coord(ipoin,1)=coorddof(dofx);coord(ipoin,2)=coorddof(dofy);
coord0(ipoin,1)=coorddof0(dofx);coord0(ipoin,2)=coorddof0(dofy);
end
%
truss2D_plotresult(amplfact,coord0,coord,F,lnods,ngdof,npoin,R,U)
% Clear all variables before terminating program
%
clear;
end
%%%%%%%%%%%%%%%%%%%%%%
Then it picks up data from this code
%**********************************************************************
% Reads all data for a 2D linear elastic truss
%
% HISTORY
% October 2018, : Initial coding (from "truss2D.m")
%***********************************************************************
function [coorddofvar,fixeddata] = truss2D_readdata(filename)
%
% Set some basic variables
% ========================
% Number of degrees of freedom per node
ndofn=2;
% Number of nodes of the element
nnode=2;
%
% Read information from data file
% ===============================
%
fid = fopen(filename, 'r');
title = fscanf(fid, 'TITLE = %s',1);
%
% Total number of elements in the mesh
nelem = fscanf(fid, '\nELEMENTS = %d', 1);
%
% Table of connectivities
%
lnods = fscanf(fid, '\n%d %d %d %f %f', [nnode+3,nelem]);
lnods = lnods';sortrows(lnods,1);
%...cross-sectional areas
csarea = lnods(:,4);
%...second moment of areas
sndmoa = lnods(:,5);
%...store only connectivities in lnods
lnods = lnods(:,2:nnode+1);
%...create table of element global degrees of freedom
eldofX = lnods*ndofn-1; eldofY = lnods*ndofn;
eldofs = [ eldofX(:,1) eldofY(:,1) eldofX(:,2) eldofY(:,2) ];
%
% Nodal coordinates
%
npoin = fscanf(fid, '\nNODE_COORDINATES = %d', 1);
coord = fscanf(fid, '\n%d %f %f', [3, npoin]);
coord = coord';sortrows(coord,1);nodnumbers=coord(:,1);
coord = coord(:,2:3);
%...create table of nodal degrees of freedom
nodofs = [ nodnumbers*ndofn-1 nodnumbers*ndofn ];
%
%
% Prescribed displacements
%
nnodefix = fscanf(fid,'\nNODES_WITH_PRESCRIBED_DISPLACEMENTS = %d',1);
ipresc = fscanf(fid, '\n%d %d %f %f', [2+ndofn, nnodefix]);
ipresc = ipresc';fixednodes=ipresc(:,1);
%...create tables of fixed dofs and corresponding prescribed values
ifdoffix = zeros(npoin*ndofn,1); icount = 0;
for inodefix = 1:nnodefix
ipoin=ipresc(inodefix,1);
dofX=nodofs(ipoin,1);dofY=nodofs(ipoin,2);
if ipresc(inodefix,2)==11
ifdoffix(dofX)=1;
ifdoffix(dofY)=1;
icount = icount+1;
valuedoffix(icount) = ipresc(inodefix,3);
fixeddoftable(icount) = dofX;
icount = icount+1;
valuedoffix(icount) = ipresc(inodefix,4);
fixeddoftable(icount) = dofY;
elseif ipresc(inodefix,2)==1
ifdoffix(dofY)=1;
icount = icount+1;
valuedoffix(icount) = ipresc(inodefix,4);
fixeddoftable(icount) = dofY;
elseif ipresc(inodefix,2)==10
ifdoffix(dofX)=1;
icount = icount+1;
valuedoffix(icount) = ipresc(inodefix,3);
fixeddoftable(icount) = dofX;
elseif ipresc(inodefix,2)==0
else
error('Wrong displacement prescription code in data file')
end
end
%...create table of free dofs by subtracting the set of fixed dofs
% from the set of all dofs
ngdof=npoin*ndofn;alldoftable=[1:ngdof]';
freedoftable = setxor(alldoftable,fixeddoftable);
%
% Material properties
%
matprop.young = fscanf(fid, '\nYOUNG_MODULUS = %f', 1);
matprop.yield = fscanf(fid, '\nYIELD_STRESS = %f', 1);
%
% Load vector (point loads only)
%
npload = fscanf(fid,'\nPOINT_LOADS = %d',1);
pload = fscanf(fid, '\n%d %f %f', [1+ndofn, npload]);
pload = pload';
%...add point loads to global load vector
F=zeros(ngdof,1);
loadednodes=pload(:,1);
loadeddofs=nodofs(loadednodes,:);
F(loadeddofs) = pload(:,2:3);
%
% Reads deformation amplification factor (for plotting only)
amplfact = fscanf(fid,'\nPLOTTING_AMPLIFICATION_FACTOR = %d',1);
%
% Reads upper and lower bounds of variable coordinates to be optimised
%
nnodevar = fscanf(fid, '\nNODES_WITH_VARIABLE_COORDINATES = %d', 1);
ivar = fscanf(fid, '\n%d %d %f %f %f %f', [2+2*ndofn, nnodevar]);
ivar = ivar';varnodes=ivar(:,1);
%...create tables of variable coordinates and corresponding prescribed
% upper and lower bounds
ifcoordvar = zeros(npoin*ndofn,1); icount = 0;
upperbound=[];lowerbound=[];dofcoordvar=[];
for inodevar = 1:nnodevar
ipoin=ivar(inodevar,1);
dofX=nodofs(ipoin,1);dofY=nodofs(ipoin,2);
if ivar(inodevar,2)==11
% both x- and y-coordinates are variable
ifcoordvar(dofX)=1;
ifcoordvar(dofY)=1;
icount = icount+1;
lowerbound(icount) = ivar(inodevar,3);
upperbound(icount) = ivar(inodevar,5);
dofcoordvar(icount) = dofX;
icount = icount+1;
lowerbound(icount) = ivar(inodevar,4);
upperbound(icount) = ivar(inodevar,6);
dofcoordvar(icount) = dofY;
elseif ivar(inodevar,2)==1
% only y-coordinate is variable
ifcoordvar(dofY)=1;
icount = icount+1;
lowerbound(icount) = ivar(inodevar,4);
upperbound(icount) = ivar(inodevar,6);
dofcoordvar(icount) = dofY;
elseif ivar(inodevar,2)==10
% only x-coordinate is variable
ifcoordvar(dofX)=1;
icount = icount+1;
lowerbound(icount) = ivar(inodevar,3);
upperbound(icount) = ivar(inodevar,5);
dofcoordvar(icount) = dofX;
elseif ivar(inodevar,2)==0
disp('WARNING: Node listed with no variable coordinates for optimisation process')
else
error('Wrong variable coordinate prescription code in data file')
end
end
%************************************************************************
%
% IMPORTANT
% (DEFINIFION OF DESIGN VARIABLES)
%
% set of dofs associated with variable coordinates
dofcoordfix=setxor(alldoftable,dofcoordvar);
if isempty(dofcoordvar)
disp('No variables in optimisation problem - all nodes have fixed coordinates')
error('No variables in optimisation problem - all nodes have fixed coordinates')
end
%
% arrange coordinates following dof ordering (in one-dimensional array, as
% in global displacement vector)
coorddof=zeros(ngdof,1);
for ipoin=1:npoin
dofx=ipoin*2-1;dofy=ipoin*2;
coorddof(dofx)=coord(ipoin,1);coorddof(dofy)=coord(ipoin,2);
end
% split coordinates array into variable and fixed coordinates
coorddofvar=coorddof(dofcoordvar);coorddoffix=coorddof(dofcoordfix);
%************************************************************************
%
% Store fixed data in structure
fixeddata.amplfact=amplfact;
fixeddata.coorddoffix=coorddoffix;
fixeddata.csarea=csarea;
fixeddata.sndmoa=sndmoa;
fixeddata.dofcoordfix=dofcoordfix;
fixeddata.dofcoordvar=dofcoordvar;
fixeddata.eldofs=eldofs;
fixeddata.F=F;
fixeddata.fixeddoftable=fixeddoftable;
fixeddata.freedoftable=freedoftable;
fixeddata.lnods=lnods;
fixeddata.lowerbound=lowerbound;
fixeddata.matprop=matprop;
fixeddata.ndofn=ndofn;
fixeddata.nelem=nelem;
fixeddata.ngdof=ngdof;
fixeddata.npoin=npoin;
fixeddata.upperbound=upperbound;
fixeddata.valuedoffix=valuedoffix;
%
% Close file(s)
status = fclose(fid);
%
end
%%%%%%%%%%%%%%%%%%%%%%
The input text file is
TITLE = buckling_check_1
ELEMENTS = 9
1 1 2 1.53e-4 0.68e-8
2 2 3 1.53e-4 0.68e-8
3 1 3 1.53e-4 0.68e-8
4 1 4 1.53e-4 0.68e-8
5 3 4 1.53e-4 0.68e-8
6 3 6 1.53e-4 0.68e-8
7 3 5 1.53e-4 0.68e-8
8 4 5 1.53e-4 0.68e-8
9 6 5 1.53e-4 0.68e-8
NODE_COORDINATES = 6
1 0.0 0.0
2 0.0 4.0
3 5.0 4.0
4 5.0 0.0
5 10.0 0.0
6 10.0 4.0
NODES_WITH_PRESCRIBED_DISPLACEMENTS = 2
1 11 0.000 0.000
5 11 0.000 0.000
YOUNG_MODULUS =210000.0
YIELD STRESS =250.0
NODES_WITH_POINT_LOAD = 3
2 0 -100
4 0 -50
6 0 -100
PLOTTING_AMPLIFICATION_FACTOR =10
NODES_WITH_VARIABLE_COORDINATES = 4
2 01 0.1 0.1 1.0 1.5
3 01 0.1 0.1 1.0 1.5
4 01 0.1 0.1 1.0 1.5
6 01 0.1 0.1 1.0 1.5
채택된 답변
Ameer Hamza
2020년 3월 19일
편집: Ameer Hamza
2020년 3월 19일
It turns out that the error is caused by wrong field names in the function truss2D_readdata. Some field names in the text file are a bit different as compared to the function. Change the line
matprop.yield = fscanf(fid, '\nYIELD_STRESS = %f', 1);
to
matprop.yield = fscanf(fid, '\nYIELD STRESS = %f', 1);
and change the line
npload = fscanf(fid,'\nPOINT_LOADS = %d',1);
to
npload = fscanf(fid,'\nNODES_WITH_POINT_LOAD = %d',1);
댓글 수: 3
Thanks a lot. There was a change.
I didn't write the code. I'm trying to improve it for my work as my coding is really poor. I have spent days on this.
I feel like crying
Thanks a lot.
Ameer Hamza
2020년 3월 19일
편집: Ameer Hamza
2020년 3월 19일
Glad to be of help. I would also take this opportunity to point to this resource on debugging the MATLAB program: https://www.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html. The error message indicates the line at which the error occurred. Just add a breakpoint at that line and see what might be causing the issue. Most of the time, the problem is caused by a trivial mistake.
Thanks a lot. Saved the link
추가 답변 (0개)
카테고리
도움말 센터 및 File Exchange에서 Line Plots에 대해 자세히 알아보기
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
