1

我一直致力于在更复杂的环境中求解一些方程。但是,我想通过以下简单示例来说明我的问题。

考虑以下两个函数:

function y=f1(x)
    y=1-x;
end

function y=f2(x)
    if x<0
        y=0;
    else
        y=x;
    end
end

我想求解以下方程:f1(x)=f2(x)。我使用的代码是:

syms x;
x=solve(f1(x)-f2(x));

我收到以下错误:

??? Error using ==> sym.sym>notimplemented at 2621
Function 'lt' is not implemented for MuPAD symbolic objects.

Error in ==> sym.sym>sym.lt at 812
            notimplemented('lt');

Error in ==> f2 at 3
if x<0

我知道错误是因为x是一个符号变量,因此我无法在分段函数中进行x比较。0f2(x)

有没有办法解决这个问题并求解方程?

4

1 回答 1

1

首先,确保符号数学甚至是解决问题的合适方法。在许多情况下并非如此。看看fzerofsolve其他许多。仅当您需要公式或需要确保精度时才需要符号方法。

在这样一个旧版本的 Matlab 中,您可能希望将分段函数分解为单独的连续函数并分别求解:

syms x;
s1 = solve(1-x^2,x) % For x >= 0
s2 = solve(1-x,x)   % For x < 0

然后,您可以手动检查或数值比较输出,以确定是否有任何或所有解决方案对所选方案有效 - 如下所示:

s = [s1(double(s1) >= 0);s2(double(s2) < 0)]

您还可以利用heaviside旧版本中提供的功能。

syms x;
f1 = 1-x;
f2 = x*heaviside(x);
s = solve(f1-f2,x)

是的,Heaviside 函数为零0.5——这赋予了它适当的数学属性。您可以将其移动以比较零以外的值。这是一种标准技术。

assumptions在 Matlab R2012a+ 中,除了普通的关系运算符,您还可以利用。要添加到@AlexB 的评论,您应该在使用之前将任何逻辑比较的输出转换为符号isAlways

isAlways(sym(x<0))

在您的情况下,x显然不是“总是”在零的一侧或另一侧,但您可能仍然会发现这在其他情况下很有用。

如果您想深入了解 Matlab 的符号数学,您可以使用 MuPAD 创建分段函数,这些函数可从 Matlab 访问——例如,请参见我的示例here

于 2014-10-31T20:36:51.873 回答