我一直致力于在更复杂的环境中解决某些方程式。但是,我想通过以下简单的例子说明我的问题。
考虑以下两个功能:
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
中将0
与f2(x)
进行比较。
有没有办法解决这个问题并解决方程?
答案 0 :(得分:1)
首先,确保符号数学甚至是解决问题的合适方法。在许多情况下,它不是。查看fzero
和fsolve
以及其他许多内容。例如,只有在需要公式或需要确保精度时才需要符号方法。
在如此旧版本的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 function为0.5
为零 - 这为其提供了适当的数学属性。您可以将其移至比较零以外的值。这是一种标准技术。
在Matlab R2012a +中,除了普通的关系运算符之外,您还可以利用assumptions
。要添加到@ AlexB的评论,您应该在使用isAlways
之前将任何逻辑比较的输出转换为符号:
isAlways(sym(x<0))
在你的情况下,x
显然不是&#34;总是&#34;在一侧或另一侧为零,但在其他情况下您仍然可能会发现这很有用。
如果您想深入了解Matlab的符号数学,可以创建piecewise functions using MuPAD,可以从Matlab访问 - 例如,参见my example here。