我正在尝试在Matlab中生成分段符号函数。它必须具有象征性的原因是我希望以后能够集成/区分该功能和/或插入实际值。我有以下功能:
x^3/6 -> 0 < x 1 < x 2 < x 3 < x otherwise 例如,我想将此函数放在变量中(假设为f),然后调用
int(diff(f, 1)^2, x, 0, 4) % numbers could be different 并获得(标量)结果2/3。
我尝试了各种方法,包括piecewise()函数和符号比较,但是没有任何效果……您能帮上忙吗? :-)
回答:
一种选择是使用
heaviside函数使每个方程在其给定范围之外等于零,然后将它们全部加在一起成为一个方程:
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
更新:
尽管在问题中提到
piecewise功能不起作用,但
Karan的答案表明至少在较新版本中它起作用。目前, piecewise文档说它是在R2016b中引入的,但显然早得多了。我在R2012b的
Symbolic Math Toolbox的文档中找到了它,但是调用语法与现在不同。我在Symbolic Math Toolbox的早期文档中找不到它,但是它确实在其他工具箱(例如Statistics和Spline Toolboxes)中显示为函数,这解释了该问题中的提及(以及为什么没有提及)当时用于符号方程式)。
更多&回答...