如何求一个线性函数的逆

art*_*hur 3 python lambda python-3.x

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

我试图找到一种方法来构建一个返回反函数的 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))    
Run Code Online (Sandbox Code Playgroud)

我怎样才能做出相反的功能(F^-1(x))?

(例如:y=x/12,则12*y=x,反之为:12*x=y)。

joj*_*ojo 5

首先,最好使用def ...语句而不是lambda定义命名函数。看看这个SO 问题及其答案以获取更多详细信息。但是,如果我正确理解您想要实现的目标,最好将线性函数定义为一个类(见下文)。


线性函数的反函数

线性函数

是(谁)给的:

线性函数的逆

并且取决于斜率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
Run Code Online (Sandbox Code Playgroud)

现在您可以定义:

inches_to_meters = f_lin(0.0254)
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

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
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

inches_to_meters = f_lin(0.0254)
meters_to_inches = inches_to_meters.get_inverse()
Run Code Online (Sandbox Code Playgroud)

现在您将线性函数及其逆作为对象:

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
Run Code Online (Sandbox Code Playgroud)

这些只是两种方法,都没有lambda按要求使用。但是,我建议不要使用lambda.