如何在Matlab中求解具有分段定义函数的方程?

时间:2014-10-31 19:54:27

标签: matlab equation symbolic-math piecewise

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

考虑以下两个功能:

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)进行比较。

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

1 个答案:

答案 0 :(得分: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 function0.5为零 - 这为其提供了适当的数学属性。您可以将其移至比较零以外的值。这是一种标准技术。

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

isAlways(sym(x<0))

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

如果您想深入了解Matlab的符号数学,可以创建piecewise functions using MuPAD,可以从Matlab访问 - 例如,参见my example here