gpt4 book ai didi

matlab - 在 Matlab 中构造分段符号函数

转载 作者:太空宇宙 更新时间:2023-11-03 19:15:00 25 4
gpt4 key购买 nike

我正在尝试在 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

例如,我想把这个函数放在一个变量中(比如说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's answer表明它确实如此,至少在较新的版本中是这样。 piecewise 的文档目前说它是在 R2016b 中引入的,但它显然出现得更早。我在 Symbolic Math Toolbox 的文档中找到了它早在 R2012b,但调用语法与现在不同。我在 Symbolic Math Toolbox 的早期文档中找不到它,但它确实在其他工具箱(例如 Statistics 和 Spline Toolboxes)中显示为一个函数,这解释了它在问题中的提及(以及为什么它没有当时为符号方程式工作)。

关于matlab - 在 Matlab 中构造分段符号函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3687069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com