gpt4 book ai didi

matlab - 如何更改 'linearize' 的 Matlab 源工作区?

转载 作者:太空宇宙 更新时间:2023-11-03 20:33:28 25 4
gpt4 key购买 nike

有没有一种方法可以在函数中使用时在 Matlab 中为“线性化”定义源工作区?

这里是一个简短的最小工作示例:

clear all
sys = 'watertank';
open(sys)
sys_io(1) = linio('watertank/PID Controller',1,'input');
sys_io(2) = linio('watertank/Water-Tank System',1,'openoutput');
linsys = GetLinsys(sys,sys_io);
disp(linsys.a)

函数是:

function linsys = GetLinsys(sys,sys_io)
A = 10;
linsys = linearize(sys,sys_io);
end

输出是

-0.0500

因为 linearize 使用“基础”工作区 (A=20) 中 A 的初始值,而不是“当前”工作区 (A=10) 中的值。

不过,我希望

-0.1000

如果函数的代码包含在脚本中,则获取:

clear all
sys = 'watertank';
open(sys)
sys_io(1) = linio('watertank/PID Controller',1,'input');
sys_io(2) = linio('watertank/Water-Tank System',1,'openoutput');
A = 10;
linsys = linearize(sys,sys_io);
disp(linsys.a)

因此,问题是:如何使用该函数获得相同的结果?

对于 sim 命令,这可以通过选项来完成:

options = simset('SrcWorkspace','current');
sim('modelname',[],options)

参见 here .但是,我在线性化选项中找不到类似的东西。

非常感谢任何帮助或建议!

最佳答案

似乎将参数传递给 Simulink 的标准方法是通过 MATLAB 的基础工作区。要将 A=10 从函数传递给 Simulink,即在基础工作区中创建一个变量,您可以使用 assignin功能:

function linsys = GetLinsys(sys,sys_io)
assignin('base','A',10);
linsys = linearize(sys,sys_io);
end

然后,调用

sys = 'watertank';
open(sys)
sys_io(1) = linio('watertank/PID Controller',1,'input');
sys_io(2) = linio('watertank/Water-Tank System',1,'openoutput');
linsys = GetLinsys(sys,sys_io);
disp(linsys.a)

产量

-0.1000

正如预期的那样。

请注意,这有点危险,因为您会覆盖当时基础工作区中存在的任何 A...作为替代方案,我建议使用以下函数

function linsys = GetLinsys(sys,sys_io)

% Save old 'A', if exists
if evalin('base', 'exist(''A'',''var'')');
baseA = evalin('base','A');
end
assignin('base','A',10)

% Function call
linsys = linearize(sys,sys_io);

% Clean up
evalin('base', 'clear(''A'')');
if exist('baseA', 'var')
assignin('base','A',baseA)
end

end

这将检查名为 A 的变量是否存在于基础工作区中并将其值保存在 baseA 中。然后您可以安全地分配新的 A 并调用 linearize。最后,我们再次清除 A 并(如果需要)重新分配旧的 baseA。 - 不是很优雅,但更安全。

关于matlab - 如何更改 'linearize' 的 Matlab 源工作区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37965517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com