请解释这些命令的结果

时间:2014-06-01 11:24:58

标签: matlab symbolic-math symbolic-computation

代码是

syms x;

v = @(x) (4 - x^2)^(1/2) - (2 - x)^(1/2)*(x + 2)^(1/2);

ezplot(v(x),[-2,2]);

产生情节

enter image description here

不应该v(x)  对于[-2,2]中的每个x都为零

1 个答案:

答案 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的使用。