您可以使用 Heaviside 阶跃函数 https://en.wikipedia.org/wiki/Heaviside_step_function 将此方程写成一行。
将两个功能合二为一:
其实你想做的是
f(x) = a(x) (for x < x1)
f(x) = q (for x = x1), where q = a(x1) = b(x1)
f(x) = b(x) (for x > x1)
(半最大值)Heaviside 函数定义为
H(x) = 0 (for x < 0)
H(x) = 0.5 (for x = 0)
H(x) = 1 (for x > 0)
因此,您的功能将是
f(x) = H(x1-x) * a(c) + H(x-x1) * b(x)
因此,
f(x) = H(x1-x) * (m1*x+c1) + H(x-x1) * (m2x+c2)
如果你想实现这个,请注意许多编程语言都允许你编写类似
f(x) = (x<x1)?a(x):b(x)
这意味着如果x<x1,则返回值a(x),否则返回b(x),或者在你的情况下:
f(x) = (x<x1)?(m1*x+c1):(m2x+c2)
Matlab 实现:
在Matlab中,可以编写简单的函数如
a = @(x) m1.*x+c1,
b = @(x) m2.*x+c2,
假设您之前定义了m1、m2、c1、c2。
有几种方法可以使用/实现 Heaviside 函数
- 如果你有Matlab的
Symbolic Math Toolbox,可以直接使用heaviside()作为函数。
-
@AndrasDeak(见下面的cmets)指出,你可以在Matlab中通过输入自己编写半最大Heaviside函数H
iif = @(varargin) varargin{2 * find([varargin{1:2:end}], 1, 'first')}();
H = @(x) iif(x<0,0,x>0,1,true,0.5);
-
如果你想要一个逼近Heaviside函数的连续函数,可以使用逻辑函数H定义为
H = @(x) 1./(1+exp(-100.*x));
独立于您对 Heaviside 函数 H 的实现,您可以通过以下方式创建单线(为简单起见,我使用 x1=0):
a = @(x) 2.*x + 3;
b = @(x) -1.5.*x + 3;
这允许您将原始函数编写为单行:
f = @(x) H(-x).*a(x) + H(x).*b(x);
然后你可以绘制这个函数,例如从 -10 到 10,通过写 plot(-10:10, f(-10:10)) 你会得到下面的图。
概括:
假设你有
f(x) = a(x) (for x < x1)
f(x) = q (for x = x1), where q = a(x1) = b(x1)
f(x) = b(x) (for x1 < x < x2)
f(x) = r (for x = x2), where r = b(x2) = c(x2)
f(x) = c(x) (for x2 < x < x3)
f(x) = s (for x = x2), where s = c(x3) = d(x3)
f(x) = d(x) (for x3 < x)
通过将 Heaviside 函数相乘,您现在可以确定将计算特定函数的区域。
f(x) = H(x1-x)*a(c) + H(x-x1)*H(x2-x)*b(x) + H(x-x2)*H(x3-x)*c(x) + H(x-x3)*d(x)
PS:刚刚意识到上面的一个 cmets 也谈到了 Heaviside 函数。感谢@AndrasDeak。