Python使用*args实现多变量函数对不同维度求偏导的方法
多变量偏导函数扩展方案
核心修改思路
- 给求导函数新增
var_index参数,用来指定要对第几个位置参数求偏导,索引从0开始计数,默认设为0兼容原有调用逻辑 - 将所有入参拼接为完整的参数列表,仅修改目标索引位置的参数值计算差分,其余参数保持原值不变
最终实现代码
def firstderivative(func, *args, var_index=0): args_list = list(args) # 计算+0.001处的函数值 args_list[var_index] += 0.001 f_plus = func(*args_list) # 计算-0.001处的函数值 args_list[var_index] -= 0.002 f_minus = func(*args_list) return (f_plus - f_minus) / 0.002 def afunc(x,y,z): return x*y + x*z + y*z # 原调用逻辑,对x求偏导,输出约9.0 print(firstderivative(afunc, 2, 4, 5)) # 对第二个参数y求偏导,输出约7.0 print(firstderivative(afunc, 2, 4, 5, var_index=1)) # 对第三个参数z求偏导,输出约6.0 print(firstderivative(afunc, 2, 4, 5, var_index=2))
额外可选优化
如果想要支持按参数名求偏导,可以额外加一层参数名到索引的转换:
def firstderivative(func, *args, var_index=0, var_name=None): args_list = list(args) # 如果传了参数名,优先按参数名匹配索引 if var_name is not None: var_names = func.__code__.co_varnames[:func.__code__.co_argcount] var_index = var_names.index(var_name) args_list[var_index] += 0.001 f_plus = func(*args_list) args_list[var_index] -= 0.002 f_minus = func(*args_list) return (f_plus - f_minus) / 0.002 # 按参数名求y的偏导,输出约7.0 print(firstderivative(afunc, 2,4,5, var_name='y'))
内容的提问来源于stack exchange,提问作者user121416
相关产品推荐
相关产品推荐

