Max*_*suk 11 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 -> otherwise
Run Code Online (Sandbox Code Playgroud)
例如,我想把这个函数放在一个变量中(比如说f),然后调用
int(diff(f, 1)^2, x, 0, 4) % numbers could be different
Run Code Online (Sandbox Code Playgroud)
得到(标量)结果2/3.
我尝试了各种各样的事情,涉及分段()函数和符号比较,但没有任何效果......你能帮忙吗?:-)
一种选择是使用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
Run Code Online (Sandbox Code Playgroud)
另一种方法是在每个子范围内为每个函数执行集成,然后添加结果:
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
Run Code Online (Sandbox Code Playgroud)
更新:
虽然在问题中提到该piecewise功能不起作用,但Karan的回答表明它确实如此,至少在较新的版本中.piecewise目前的文档说它是在R2016b中引入的,但它显然早得多.我在符号数学工具箱的文档中发现它早在R2012b,但调用语法与现在不同.我在早期的Symbolic Math Toolbox文档中找不到它,但它确实在其他工具箱(例如Statistics和Spline Toolboxes)中显示为一个函数,这解释了它在问题中的提及(以及为什么它没有为当时的符号方程工作).