如何将多个函数编写/编码为一个

时间:2015-08-27 18:10:28

标签: matlab

我试图在中编写一个由两个段组成的行作为单个等式:

y = m1*x + c1 , for x<=x1
y = m2*x + c2 , for x>=x1

我的问题是:

  1. 如何将此组合线的功能写为单个等式?
  2. 如何将多个函数(在线性参数空间的不同区域中有效)编写为单个等式?
  3. 请解释如何以数学方式表达这一点以及如何在一般情况下以及在Matlab中对此进行编程。

1 个答案:

答案 0 :(得分:2)

您可以使用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,

假设您之前已定义m1m2c1c2

使用/实施Heaviside功能有多种方法

  1. 如果您拥有Matlab的Symbolic Math Toolbox,则可以直接使用heaviside()作为函数。
  2. @AndrasDeak(见下面的评论)指出你可以通过输入

    在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);
    
  3. 如果您想要一个近似于Heaviside函数的连续函数,您可以使用定义为

    的逻辑函数H
    H = @(x) 1./(1+exp(-100.*x));
    
  4. 除了您对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);
    

    然后您可以通过编写plot(-10:10, f(-10:10))来绘制此函数,例如从-10到10,您将得到下面的图。

    Example of a plot using the Heaviside/logistic function to combine two linear segments to a single 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 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:刚才意识到上面的一条评论也谈到了Heaviside的功能。感谢@AndrasDeak。