![]() |
在Matlab中构造分段符号函数
我正在尝试在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()函数和符号比较,但是没有任何效果……您能帮上忙吗? :-) [B]回答:[/B] 一种选择是使用[URL="http://www.mathworks.com/help/symbolic/heaviside.html"]heaviside[/URL]函数使每个方程在其给定范围之外等于零,然后将它们全部加在一起成为一个方程: 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 [B]更新:[/B] 尽管在问题中提到[URL="https://www.mathworks.com/help/symbolic/piecewise.html"]piecewise[/URL]功能不起作用,但[URL="https://stackoverflow.com/a/41991115/52738"]Karan的答案[/URL]表明至少在较新版本中它起作用。目前, piecewise文档说它是在R2016b中引入的,但显然早得多了。我在R2012b的[URL="https://www.mathworks.com/help/symbolic/index.html"]Symbolic Math Toolbox[/URL]的文档中找到了它,但是调用语法与现在不同。我在Symbolic Math Toolbox的早期文档中找不到它,但是它确实在其他工具箱(例如Statistics和Spline Toolboxes)中显示为函数,这解释了该问题中的提及(以及为什么没有提及)当时用于符号方程式)。 [url=https://stackoverflow.com/questions/3687069]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 23:20。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.