0

代码是

syms x;

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

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

这产生了一个情节

在此处输入图像描述

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

4

1 回答 1

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) 的值替换为零。请注意方程式与原始方程式有何不同。它已被“向量化”(请参阅​​句点的使用)以允许评估输入向量,而不必遍历向量中的每个元素。另请注意,当我们将它传递给时,ezplot我们必须在函数名称前加上 & 符号:

ezplot(@v_func,[-2,2]);

第二种方法需要将您的第一个匿名函数包装v在其他几个函数中(请参阅匿名函数和条件)。我们从已矢量化的原始函数开始:

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因为我没有符号工具箱。

于 2014-06-01T14:13:46.423 回答