如何在Python中测试线性(叠加)和移位方差?

2024-09-30 14:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python&;编写具有函数的程序:

X = np.linspace(0,50)
F1 = np.sin(X)

测试函数是否为线性(如中所示,显示叠加):

for i in range(1,10):
  LT1 = i*(F1)
  X = i*X
  LT2 = F1
  if np.all(LT1) == np.all(LT2):
    Linear = 'This function is linear.'
  elif np.all(LT1) != np.all(LT2):
    Linear = 'This function is nonlinear.'
    break

并测试函数是否具有平移不变性:

for j in range(1,10):
  SI1 = (F1)-j
  X = X-j
  SI2 = F1
  if np.all(SI1) == np.all(SI2):
    SI = 'This function is shift-invariant.'
  elif np.all(SI1) != np.all(SI2):
    SI = 'This function is shift-variant.'
    break

但是我的代码调用所有函数,不管是否是LSI,线性&;移位变量。有没有更好的方法来运行这些测试?我见过线性回归作为测试线性的一种方法,但在尝试使用正弦函数时,它错误地将函数分类为非线性。我也找不到任何关于测试移位不变性的指导


Tags: 函数forisnpfunction线性allthis
2条回答

@Ragnar提供了一个非常好的数学解决方案,但我想发布一个简短的解决方案

如果函数由等距的值给出,则

print(all(abs(x) < 0.001 for x in np.diff(function, n=2)))

如果函数是线性的,则返回True,否则返回False

其思想是,每次函数都以相同的值递增(这里我使用的是X是等距的)。因此,取连续数字的差应该返回具有所有相同项的数组。如果函数是线性的,则再次取连续数的差返回所有零

让我们首先定义所有必需的功能

import numpy as np

def check_linearity(T, X, a, b):
  # T[a*x+b*x] = a*T[x] + b*T[x]
  LHS = T(a*x + b*x)
  RHS = a*T(x) + b*T(x)
  tolerence = 1e-4
  if np.sum(LHS-RHS) < tolerence:
    print('Linear System')
    return True
  else:
    print('Not a Linear System')
    return False

def check_shift_invariance(T, X, tau):
  # T[X] = T[X-tau]
  LHS = T(X)
  RHS = T(X-tau)
  tolerence = 1e-4
  if np.sum(LHS-RHS) < tolerence:
    print('Shift Invariant System')
    return True
  else:
    print('Not a Shift Invariant System')
    return False

def check_LSI(T, X, a, b, tau):
  flag1 = check_linearity(T, X, a, b)
  flag2 = check_shift_invariance(T, X, tau)
  if flag1== True and flag2==True:
    print('LSI system')
  else:
    print('not a LSI system') 

接下来,我们定义信号

# Signal X in range [-1,1]
X = np.linspace(-1,1,10)

定义系统

# Transformation T 
T = lambda x: np.sin(x)

现在让我们看看我们在行动中定义的一切

a = 1
b = 1
tau = 2*np.pi
# Check Linearity
check_linearity(T, X, a, b);
# Check Shift Invariance
check_shift_invariance(T, X, tau);
# Check LSI or not
check_LSI(T, X, a, b, tau);

您可以轻松定义其他系统,例如

T = lambda x: x
T = lambda x:  np.sin(x) + np.cos(x)
T = lambda x: x**2 + x + 2

等等

相关问题 更多 >