在Matlab中构造分段符号函数 [英] Constructing piecewise symbolic function in Matlab

查看:566
本文介绍了在Matlab中构造分段符号函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Matlab中生成分段符号函数.它必须具有象征性的原因是我希望以后能够集成/区分该功能和/或插入实际值.我具有以下功能:

I am trying to generate a piecewise symbolic function in Matlab. The reason it has to be symbolic is I want to be able to integrate/differentiate the function afterwards and/or insert actual values. I have the following function:

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

例如,我想将此函数放在变量中(假设为f),然后调用

For example, I want to put this function in a variable (let's say f) and then call

int(diff(f, 1)^2, x, 0, 4) % numbers could be different

并获得(标量)结果2/3.

and get the (scalar) result 2/3.

我尝试了各种方法,包括piecewise()函数和符号比较,但是没有任何效果……您能帮上忙吗? :-)

I tried various things, involving the piecewise() function and symbolic comparisions, but nothing worked... can you help? :-)

推荐答案

一种选择是使用

One option is to use the heaviside function to make each equation equal zero outside of its given range, then add them all together into one equation:

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

另一种选择是对每个子范围内的每个函数执行积分,然后添加结果:

Another alternative is to perform your integration for each function over each subrange then add the results:

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的早期文档中找不到它,但是它确实在其他工具箱(例如Statistics和Spline Toolboxes)中显示为函数,这解释了问题中的提及(以及为什么没有提及)当时用于符号方程式.

Although it's mentioned in the question that the piecewise function didn't work, Karan's answer suggests it does, at least in newer versions. The documentation for piecewise currently says it was introduced in R2016b, but it was clearly present much earlier. I found it in the documentation for the Symbolic Math Toolbox as far back as R2012b, but the calling syntax was different than it is now. I couldn't find it in earlier documentation for the Symbolic Math Toolbox, but it did show up as a function in other toolboxes (such as the Statistics and Spline Toolboxes), which explains its mention in the question (and why it didn't work for symbolic equations at the time).

这篇关于在Matlab中构造分段符号函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆