错误:
问题分析:
这是由于在matlab中,将子函数与主函数放在了一个.m文件下。
解决办法:
将自定义的子函数,在同一文件夹下单独建立一个.m文件就好了(注意自定义函数名和.m名保持一致)
实例演示:
以洛伦茨系统的模拟这一函数代码为例
这里将自定义函数(红框中的部分)放在了主函数同一.m文件下
就会出现如下情况
解决方案:我们只需要在同一文件夹下建立一个名为lorenz_system_dynamics.m(与自定义函数同名)的子函数就好
主函数lorenz.m部分代码:
%% Lorenz system - Chaos | Butterfly effect
% Simulation and animation of the Lorenz system.
%
%%
clear ; close all ; clc
%% Parameters
% System
sigma = 10;
beta = 8/3;
rho = 28;
% Video
tF = 60; % Final time [s]
fR = 30; % Frame rate [fps]
dt = 1/fR; % Time resolution [s]
time = linspace(0,tF,tF*fR); % Time [s]
%% Simulation
N = 4; % Resolution increase factor
fR_sim = N*fR; % Frame rate for simulation [fps]
time_sim = linspace(0,tF,tF*fR_sim); % Time [s]
[t,states] = ode45(@(t,states) lorenz_system_dynamics(t,states,sigma,beta,rho),time_sim,[1 1 1]);
%% Animation
figureHandle=figure( 'Color',[0 0 0]);
axesHandle = axes('Parent',figureHandle,...
'YGrid','on',... % 显示Y轴
'YColor',[1 1 1],...% Y轴设置白色
'XGrid','on',...
'XColor',[1 1 1],...% 显示X轴
'ZGrid','on',...
'ZColor',[1 1 1],...% 显示X轴
'Color',[0 0 0]); % X轴设置白色
xlabel(axesHandle,'数据量');% X轴标签
ylabel(axesHandle,'值'); % Y轴标签
set(gcf,'Position',[50 50 1280 720]) % YouTube: 720p
% set(gcf,'Position',[50 50 854 480]) % YouTube: 480p
% set(gcf,'Position',[50 50 640 640]) % Instagram
% Create and open video writer object
v = VideoWriter('lorenz_system.mp4','MPEG-4');
v.Quality = 100;
v.FrameRate = fR;
open(v);
% Projection planes
x_plane = -60;
y_plane = 65;
z_plane = 0;
for i=1:length(time)
j = N*i; % Scaling iteration
cla
hold on ; grid on ; axis equal ; box on
set(gca,'CameraPosition',[416.8978 -479.6666 263.5680],'xlim',[x_plane 30],'ylim',[-30 y_plane],'zlim',[z_plane 50])
% Trajectory
plot3(states(1:j,1),states(1:j,2),states(1:j,3),'r')
% Projections
plot3(x_plane*ones(j,1),states(1:j,2),states(1:j,3),'b') % yz
plot3(states(1:j,1),y_plane*ones(j,1),states(1:j,3),'w') % xz
plot3(states(1:j,1),states(1:j,2),z_plane*ones(j,1),'m') % xy
xlabel('x')
ylabel('y')
zlabel('z')
frame = getframe(gcf);
writeVideo(v,frame);
end
close(v);
子函数lorenz_system_dynamics.m部分代码:
function dstate = lorenz_system_dynamics(~,states,sigma,beta,rho)
dstate(1,1) = -sigma*states(1) + sigma*states(2);
dstate(2,1) = rho*states(1) - states(2) - states(1)*states(3);
dstate(3,1) = -beta*states(3) + states(1)*states(2);
end
这样简单处理之后就能正常运行了,运行结果如下: