代码是
syms x;
v = @(x) (4 - x^2)^(1/2) - (2 - x)^(1/2)*(x + 2)^(1/2);
ezplot(v(x),[-2,2]);
产生情节
不应该v(x) 对于[-2,2]中的每个x都为零
答案 0 :(得分:1)
如果想要取代"小"等式输出中的值为零,则需要输出数据上的某种if
条件。遗憾的是,您无法向匿名函数添加if
,但您可以执行以下两项操作之一:定义标准函数(在程序文件中)或将匿名函数包装在另一个函数中。第一种方式更直接:
function [y] = v_func(x)
y = (4 - x.^2).^(1/2) - (2 - x).^(1/2).*(x + 2).^(1/2);
y(abs(y)<1e-10)=0;
end
以上执行与以前相同的计算,第二行代码将所有小于某个容差(1e-10)的值替换为零。请注意该等式与原始等式略有不同。它已被&#34;矢量化&#34; (请参阅句点的使用)以允许评估输入向量,而不必遍历向量中的每个元素。另请注意,当我们将其传递给ezplot
时,我们必须在函数名前加上&符号:
ezplot(@v_func,[-2,2]);
第二种方法需要将您的第一个匿名函数v
包装在其他几个函数中(请参阅anonymous functions and conditions)。我们从已经矢量化的原始函数开始:
v = @(x) (4 - x.^2).^(1/2) - (2 - x).^(1/2).*(x + 2).^(1/2);
和(条件)函数用零替换小于某个容差的所有值:
cond = @(y)(y*(1-(abs(y)<1e-10)))
然后我们将两者包装在一起
func = @(x)cond(v(x))
以便条件函数评估v
的输出。与ezplot
放在一起可以得到:
ezplot(func,[-2,2]);
并且所有输出(如图中所示)应为零。
图标题不是你想要的,所以可以用以下的一些变体替换:
plotTitle = func2str(v);
title(strrep(plotTitle(5:end),'.','')); % as I don't want '@(x)' or periods to
% appear in the title
由于我没有使用符号工具箱,我忽略了sym
的使用。