Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 在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()函数和符号比较,但是没有任何效果……您能帮上忙吗? :-)



回答:

一种选择是使用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)中显示为函数,这解释了该问题中的提及(以及为什么没有提及)当时用于符号方程式)。



更多&回答...
poster 当前离线   回复时引用此帖
 


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 19:41


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.