I get a warning with ODE45 and the code runs but slowly and message constantly appears while running: arning: The value of local variables may have been changed to match the globals...
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Matthew Gill
el 4 de Nov. de 2017
Comentada: Walter Roberson
el 4 de Nov. de 2017
Please help! First time to post a question here.
Warning: The value of local variables may have been changed to match the globals. Future versions of
MATLAB will require that you declare a variable to be global before you use that variable.
I have tried using all global and passing all through function. Some work both ways and some don't.
%%%SCRIPT
global TD y0 xi T
inputsize=1559;
m=1;
k=1;
h=0.02;
numberTDs=5;
%Import data and zero time and acceleration matrices
data=importdata('EarthquakeData.xlsx');
[ii,jj]=size(data);
acc=zeros(1,inputsize);
%T=zeros(1,inputsize);
T=0:h:(inputsize-1)*h;
n=1;
for i=1:ii
for j=1:jj
acc(1,n)=data(i,j);
n=n+1;
if n>inputsize
break
end
end
end
y0=[0,0];
[t,Y]=ode45('goodfunction1',T,y0,[],acc);
%%%FUNCTION
function ydot=goodfunction1(t,y,T,acc)
global TD xi y0 T
a=interp1(T,acc,t);
y0=[0,0];
ydot=[y(2);-(4*3.14159*xi/TD)*y(2)-(2*3.14159/TD)^2*y(1)-a];
end
0 comentarios
Respuesta aceptada
Walter Roberson
el 4 de Nov. de 2017
inputsize=1559;
m=1;
k=1;
h=0.02;
numberTDs=5;
%Import data and zero time and acceleration matrices
data=importdata('EarthquakeData.xlsx');
[ii,jj]=size(data);
acc=zeros(1,inputsize);
%T=zeros(1,inputsize);
T=0:h:(inputsize-1)*h;
n=1;
for i=1:ii
for j=1:jj
acc(1,n)=data(i,j);
n=n+1;
if n>inputsize
break
end
end
end
y0 = [0,0];
C1 = (4*pi*xi/TD);
C2 = (2*pi/TD)^2;
[t, Y] = ode45( @(t,y) goodfunction1(t, y, acc, C1, C2), T, y0);
%%%FUNCTION
function ydot = goodfunction1(t, y, acc, C1, C2 )
a = interp1(T, acc, t);
ydot = [y(2); -C1*y(2) - C2*y(1) - a];
end
However... your use of interp1 to interpolate tells us that your equations are at best piecewise continuous. That is not good enough for any of the ode*() solvers. ode45() will probably detect the inconsistency in equations the first time a makes a non-linear change, and will spend a whole lot of time trying to narrow down the instability. This would be very slow if it works at all.
In any case in which your equation suddenly changes like this, you should be stopping the ode and starting again with another ode45 call using the boundary conditions returned by the previous one. ode45() cannot handle discontinuities in any derivative that it is working with (and probably not in two more beyond that.)
4 comentarios
Más respuestas (0)
Ver también
Categorías
Más información sobre Ordinary Differential Equations en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!