如何使线性函数的逆

时间:2018-01-06 10:27:37

标签: python python-3.x lambda

我尝试使用线性函数进行数据转换(例如米到英尺)。

我试图找到一种方法来构建一个返回反函数的lambda函数和另一个返回这些函数组合的lambda函数

inches_to_meters=lambda x:x*0.0254
inches_to_feets=lambda x:x*(1/12)
miles_to_feets=lambda x:x*5280
composition=lambda x,y,z: lambda x,y: x(y(z))
opposite=lambda x: 1/x
meters_to_inches=opposite(inches_to_meters)
miles_to_inches = composition(feets_to_inches, miles_to_feets)
print(meters_to_inches(10))    

如何制作相反的功能(F^-1(x))?

(例如:y=x/12,然后12*y=x,相反的是:12*x=y)。

3 个答案:

答案 0 :(得分:4)

首先,最好使用def ...语句而不是lambda来定义命名函数。有关更多详细信息,请查看this SO问题及其答案。但如果我理解你想要实现的目标,那么将线性函数定义为一个类可能会更好(见下文)。

linear function的反转:

linear function

由:

给出

inverse of linear function

并且取决于斜率a和拦截b。这样做的一个重要结果是您需要知道ab以函数形式定义其逆

在python中你可以实现这个,例如你定义一个线性函数类,而反函数作为其方法之一

class f_lin:
    def __init__(self, a, b=0):
        self.a = float(a)
        self.b = b

    def __call__(self, x):
        return self.a * x + self.b

    def inv(self, y):
        return (y - self.b) / self.a

现在你可以定义:

inches_to_meters = f_lin(0.0254)

并像这样使用它:

inches_to_meters(10)
Out[38]: 0.254
inches_to_meters.inv(0.254)
Out[39]: 10.0
inches_to_meters.inv(inches_to_meters(10))
Out[40]: 10.0

或者你也可以为逆创建一个新对象,因为线性函数的倒数仍然是线性函数

class f_lin:
    def __init__(self, a, b=0):
        self.a = float(a)
        self.b = b

    def __call__(self, x):
        return self.a * x + self.b

    def get_inverse(self):
        return self.__class__(1/self.a, - self.b/self.a)

然后你可以像这样定义反函数:

inches_to_meters = f_lin(0.0254)
meters_to_inches = inches_to_meters.get_inverse()

现在你既有线性函数又有反函数作为对象:

inches_to_meters(10)
Out[43]: 0.254
meters_to_inches(0.254)
Out[44]: 10.0
inches_to_meters(meters_to_inches(10))
Out[45]: 10.0

这只是两种做法,两者都没有按要求使用lambda。但是我建议不要使用lambda 来执行此类操作。

答案 1 :(得分:0)

opposite = lambda f : (lambda x: x*x*1/f(x))

完美的工作

答案 2 :(得分:0)

我同意接受的答案:由于池lambda表达式的池回溯和字符串表示,一般不建议使用lambda

但是在我看来,lambda在线性函数逆的情况下仍然有用。但是,如果函数变得复杂,我仍然更喜欢def语句。

无论如何,以下是lambda实施:

a = 2
b = 3 
func = lambda x: a*x+b
inverse = lambda f: (lambda y: (y-b) / a)
func_inv = inverse(func)

# test
for x in range(10):
    y = func(x)
    x1 = func_inv(y)
    print('For y=f(x)={}x+{} when x={},'.format(a, b, x), 'y={}'.format(y))
    print("inverse function of y={} is {}\n".format(y, x1))
    assert x == x1

输出:

For y=f(x)=2x+3 when x=0, y=3
inverse function of y=3 is 0.0

For y=f(x)=2x+3 when x=1, y=5
inverse function of y=5 is 1.0

For y=f(x)=2x+3 when x=2, y=7
inverse function of y=7 is 2.0

For y=f(x)=2x+3 when x=3, y=9
inverse function of y=9 is 3.0

For y=f(x)=2x+3 when x=4, y=11
inverse function of y=11 is 4.0

For y=f(x)=2x+3 when x=5, y=13
inverse function of y=13 is 5.0

For y=f(x)=2x+3 when x=6, y=15
inverse function of y=15 is 6.0

For y=f(x)=2x+3 when x=7, y=17
inverse function of y=17 is 7.0

For y=f(x)=2x+3 when x=8, y=19
inverse function of y=19 is 8.0

For y=f(x)=2x+3 when x=9, y=21
inverse function of y=21 is 9.0