在Matlab中构造分段符号函数

在Matlab中构造分段符号函数,matlab,symbolic-math,piecewise,Matlab,Symbolic Math,Piecewise,我试图在Matlab中生成一个分段符号函数。它必须是符号的原因是我希望能够在之后集成/区分函数和/或插入实际值。我有以下功能: x^3/6 -> 0 < x <= 1 (1/6)*(-3*x^3+12*x^2-12x+4) -> 1 < x <= 2 (1/6)*(3*x^3-24*x^2+60x-44) -> 2 < x <= 3 (1/6)*(4-x)^3 -> 3 < x <= 4 0

我试图在Matlab中生成一个分段符号函数。它必须是符号的原因是我希望能够在之后集成/区分函数和/或插入实际值。我有以下功能:

x^3/6   ->   0 < x <= 1
(1/6)*(-3*x^3+12*x^2-12x+4)   ->   1 < x <= 2
(1/6)*(3*x^3-24*x^2+60x-44)   ->   2 < x <= 3
(1/6)*(4-x)^3   ->   3 < x <= 4
0   ->   otherwise
并得到(标量)结果2/3

我尝试了各种方法,包括分段()函数和符号比较,但都不起作用。。。你能帮忙吗?:-)

一个选项是使用函数使每个方程在其给定范围外等于零,然后将它们全部相加到一个方程中:

syms x;
f = (heaviside(x)-heaviside(x-1))*x^3/6 + ...
    (heaviside(x-1)-heaviside(x-2))*(1/6)*(-3*x^3+12*x^2-12*x+4) + ...
    (heaviside(x-2)-heaviside(x-3))*(1/6)*(3*x^3-24*x^2+60*x-44) + ...
    (heaviside(x-3)-heaviside(x-4))*(1/6)*(4-x)^3;
double(int(diff(f, 1)^2, x, 0, 4))

ans =

    0.6667
另一种方法是对每个子范围内的每个函数执行积分,然后添加结果:

syms x;
eq1 = x^3/6;
eq2 = (1/6)*(-3*x^3+12*x^2-12*x+4);
eq3 = (1/6)*(3*x^3-24*x^2+60*x-44);
eq4 = (1/6)*(4-x)^3;
total = int(diff(eq1, 1)^2, x, 0, 1) + ...
        int(diff(eq2, 1)^2, x, 1, 2) + ...
        int(diff(eq3, 1)^2, x, 2, 3) + ...
        int(diff(eq4, 1)^2, x, 3, 4)

total =

2/3

更新:

尽管问题中提到该函数不起作用,但至少在较新版本中是这样。
分段
的文档目前说它是在R2016b中引入的,但它显然出现得更早。我在R2012b的文档中找到了它,但是调用语法与现在不同。我在早期的符号数学工具箱文档中找不到它,但它确实在其他工具箱(如统计和样条线工具箱)中以函数形式出现,这解释了问题中提到它的原因(以及当时为什么它不适用于符号方程).

一个选项是使用函数使每个方程在其给定范围外等于零,然后将它们全部相加为一个方程:

syms x;
f = (heaviside(x)-heaviside(x-1))*x^3/6 + ...
    (heaviside(x-1)-heaviside(x-2))*(1/6)*(-3*x^3+12*x^2-12*x+4) + ...
    (heaviside(x-2)-heaviside(x-3))*(1/6)*(3*x^3-24*x^2+60*x-44) + ...
    (heaviside(x-3)-heaviside(x-4))*(1/6)*(4-x)^3;
double(int(diff(f, 1)^2, x, 0, 4))

ans =

    0.6667
另一种方法是对每个子范围内的每个函数执行积分,然后添加结果:

syms x;
eq1 = x^3/6;
eq2 = (1/6)*(-3*x^3+12*x^2-12*x+4);
eq3 = (1/6)*(3*x^3-24*x^2+60*x-44);
eq4 = (1/6)*(4-x)^3;
total = int(diff(eq1, 1)^2, x, 0, 1) + ...
        int(diff(eq2, 1)^2, x, 1, 2) + ...
        int(diff(eq3, 1)^2, x, 2, 3) + ...
        int(diff(eq4, 1)^2, x, 3, 4)

total =

2/3

更新:

尽管问题中提到该函数不起作用,但至少在较新版本中是这样。
分段
的文档目前说它是在R2016b中引入的,但它显然出现得更早。我在R2012b的文档中找到了它,但是调用语法与现在不同。我在早期的符号数学工具箱文档中找不到它,但它确实在其他工具箱(如统计和样条线工具箱)中以函数形式出现,这解释了问题中提到它的原因(以及为什么它当时不适用于符号方程)。

启动R2016b,使用该函数

symsx
y=分段(x0,1)
y=
分段(x<0,-1,0
在这种情况下:

syms x
f = piecewise( ...
0< x <=1, x^3/6, ...
1 < x <= 2, (1/6)*(-3*x^3+12*x^2-12*x+4), ...
2 < x <= 3, (1/6)*(3*x^3-24*x^2+60*x-44), ...
3 < x <= 4, (1/6)*(4-x)^3, ...
0)

f =
piecewise(x in Dom::Interval(0, [1]), x^3/6, x in Dom::Interval(1, [2]), - x^3/2 + 2*x^2 - 2*x + 2/3, x in Dom::Interval(2, [3]), x^3/2 - 4*x^2 + 10*x - 22/3, x in Dom::Interval(3, [4]), -(x - 4)^3/6, 0)

int(diff(f, 1)^2, x, 0, 4)
ans =
2/3
symsx
f=分段(。。。
0
symsx
y=分段(x0,1)
y=
分段(x<0,-1,0
在这种情况下:

syms x
f = piecewise( ...
0< x <=1, x^3/6, ...
1 < x <= 2, (1/6)*(-3*x^3+12*x^2-12*x+4), ...
2 < x <= 3, (1/6)*(3*x^3-24*x^2+60*x-44), ...
3 < x <= 4, (1/6)*(4-x)^3, ...
0)

f =
piecewise(x in Dom::Interval(0, [1]), x^3/6, x in Dom::Interval(1, [2]), - x^3/2 + 2*x^2 - 2*x + 2/3, x in Dom::Interval(2, [3]), x^3/2 - 4*x^2 + 10*x - 22/3, x in Dom::Interval(3, [4]), -(x - 4)^3/6, 0)

int(diff(f, 1)^2, x, 0, 4)
ans =
2/3
symsx
f=分段(。。。

012x
也需要修复。关于R2012b,您可能指的是MuPAD分段函数,它是与符号数学工具箱不同的接口。对于SMT,它是在R2016b中引入的。对于工具箱的混乱,很抱歉。如果我能回答任何其他问题,请告诉我ons@Karan:我现在明白了。它首先出现在R2012b()的文档中,但只能作为通过MuPAD接口访问的函数,而不是MATLAB本身。R2016b的最新版本可以直接从MATLAB调用。@Jonas:谢谢。
12x
也需要修复。关于R2012b,您可能指的是MuPAD分段函数,它是与符号数学不同的接口工具箱。对于SMT,它是在R2016b中引入的。很抱歉与工具箱混淆。如果我能回答任何其他问题,请告诉我。@Karan:我现在明白了。它首先出现在R2012b中的文档中(),但只能作为通过MuPAD接口访问的函数,而不是MATLAB本身。R2016b中的最新版本可以直接从MATLAB调用。对下行表决的解释会很有帮助,因为这是在符号数学工具箱中创建分段函数的推荐方法。我猜下行表决是因为您的旧示例没有与问题完全不匹配;你的新例子应该可以弥补这一点。此外,我的答案中的更新可能会引起人们的兴趣。人们可能已经投了反对票,因为问题特别提到了“分段”
不起作用,这在被问到的时候实际上不起作用,但现在如你所示。很公平。我希望我编辑的答案是有用的。哈y来回答任何其他问题。对否决票的解释会很有帮助,因为这是在符号数学工具箱中创建分段函数的推荐方法。我猜否决票是因为您的旧示例与问题完全不匹配;您的新示例应该可以解决这一问题。此外,我的答案中的更新可能会引起兴趣。人们可能已经投了反对票,因为问题特别提到了“分段”
不起作用,而在被问到的时候它实际上没有,但现在正如你所说的那样。很公平。我希望我编辑的答案是有用的。很高兴回答任何其他问题。