2014-10-31 441 views
1

我一直在努力解决一个更复杂的上下文中的方程。但是,我想通过以下简单示例来说明我的问题。如何用Matlab中的分段定义函数求解方程?

考虑以下两个功能:

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是一个象征性的变量,因此我无法在分段与0比较x功能f2(x)

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

+0

您使用的是什么'版本'的Matlab? – horchler 2014-10-31 19:58:35

+0

在版本R2012a中引入了使用“<”创建符号关系的功能。 – Alex 2014-10-31 20:07:22

+0

解决方法有很多,但符号工具箱的变化非常大,以至于解决方案可能会严重依赖于版本。 – horchler 2014-10-31 20:12:18

回答

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显然不是“永远”一方或另一方的零,但您仍然可以在其他情况下找到它。

如果您想深入研究Matlab的符号数学,您可以创建piecewise functions using MuPAD,这些可从Matlab访问 - 例如,请参阅my example here