Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我正在尝试在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)中显示为函数,这解释了该问题中的提及(以及为什么没有提及)当时用于符号方程式)。 更多&回答... |
![]() |
![]() |