错误:

 问题分析:

这是由于在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

这样简单处理之后就能正常运行了,运行结果如下: 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐