我在这里使用的代码是为了说明可能的错误。在代码中,我定义了三个函数,并尝试将它们可视化。
第一个:
$$y_1(x)=5\sin(x)$$
第二个:
$$y_2(x)=12-8\cos(x)$$
第三部分是以上两者的分段组合:
when x<0:
$$y_3(x)=y_1(x)$$
when x>=0:
$$y_3(x)=(y_1(x)+y_2(x))/2$$
当我在Matlab中运行以下代码时,保存为m2mPlot.m
:
function m2mPlot
clear all
close all
clc
global a b c;
a=12;
b=8;
c=5;
t=-pi:.1:pi;
plot(t,y1(t),'b')
hold on
plot(t,y2(t),'m')
plot(t,y3(t),'r')
legend('y1','y2','y3')
function y=y1(t)
% The first function for testing
global c;
y=c*sin(t);
function y=y2(t)
% The 2nd function for testing
global a b;
y=a-b*cos(t);
function y=y3(t)
% The 3rd function for testing
if t<0 % It seems this logic value is always FALSE, why?
y=y1(t);
else
y=(y2(t)+y1(t))/2;
end
我得到了:
这表明在第三个子函数中逻辑表达式:t <0始终为FALSE,无论实际值是多少。
这是Matlab中的错误吗?如何避免这样的问题?
答案 0 :(得分:2)
这不是MATLAB中的错误,您只是错误地使用它。
您正在呼叫y3(t)
,其中t
是一个向量,即t=-pi:.1:pi;
。但y3
的代码在条件中使用t
,即if t<0
。由于t<0
的结果是向量,并且if
语句需要标量,因此它不会按预期工作。正如Troy Haskin在评论中指出的那样,来自MATLAB docs:
如果expression,statements,end计算表达式,并在表达式为true时执行一组语句。当结果为非空并且仅包含非零元素(逻辑或实数)时,表达式为true。 否则,表达式为false。
您的t<0
向量包含许多false
个值,因此if
会将其评估为false
。我建议你只需要给MATLAB if
一个标量。
如果您想以矢量化方式创建y3
函数,请尝试改为:
function y=y3(t)
y=y1(t).*(t<0) + y2(t).*(t>=0);
end