From f136c1a9fc6ea26b6c7d2f3d80a0d50dca2a172c Mon Sep 17 00:00:00 2001 From: snowy Date: Thu, 29 Aug 2024 18:52:19 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=96=B0=E5=A2=9E=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=9F=AF=E9=87=8C=E5=8C=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mbcp/mp_math/equation.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/mbcp/mp_math/equation.py b/mbcp/mp_math/equation.py index a5fbfcc..63fda40 100644 --- a/mbcp/mp_math/equation.py +++ b/mbcp/mp_math/equation.py @@ -49,7 +49,7 @@ def get_partial_derivative_func(func: MultiVarsFunc, var: int | tuple[int, ...], """ 求N元函数一阶偏导函数。这玩意不太稳定,慎用。 > [!warning] - > 目前数学界对于数值微分的稳定性问题还没有很好的解决方案,因此这个函数的稳定性也不是很好。 + > 目前数学界对于一个函数的导函数并没有通解的说法,因此该函数的稳定性有待提升 Args: func: 函数 @@ -76,6 +76,7 @@ def get_partial_derivative_func(func: MultiVarsFunc, var: int | tuple[int, ...], args_list_minus = list(args) args_list_minus[var] -= epsilon return (func(*args_list_plus) - func(*args_list_minus)) / (2 * epsilon) + return partial_derivative_func elif isinstance(var, tuple): def high_order_partial_derivative_func(*args: Var) -> Var: @@ -84,6 +85,24 @@ def get_partial_derivative_func(func: MultiVarsFunc, var: int | tuple[int, ...], for v in var: result_func = get_partial_derivative_func(result_func, v, epsilon) return result_func(*args) + return high_order_partial_derivative_func else: raise ValueError("Invalid var type") + + +def curry(func: MultiVarsFunc, *args: Var) -> OneVarFunc: + """ + 对多参数函数进行柯里化。 + > [!tip] + > 有关函数柯里化,可参考[函数式编程--柯理化(Currying)](https://zhuanlan.zhihu.com/p/355859667) + Args: + func: 函数 + *args: 参数 + Returns: + 柯里化后的函数 + """ + def curried_func(*args2: Var) -> Var: + """@litedoc-hide""" + return func(*args, *args2) + return curried_func