netspirit 发表于 2021-5-28 20:14

关于python多阶求导递归算法的问题和优化

本帖最后由 netspirit 于 2021-5-28 20:22 编辑

写了一个python求多阶导数的算法,总是报错
递归我不太熟悉,请问一下这类算法该怎么优化?
好像只要求导次数超过2就会报错了
用递归的方法我又不知道怎么写
我知道有些库可以直接算导数,我就是想研究一下算法的.
#coding=utf-8
def get_daoshu_value(func,x):
    #求出一个函数导数值
    # jieshu = jieshu-1
    result=(func(x+0.00001)-func(x))/0.00001
    return result
#1.
def get_2jie_daoshu(func,x):
    #获取二阶导数
    result=(get_daoshu_value(func,x+0.00001)-get_daoshu_value(func,x))/0.00001
    return result
def get_3jie_daoshu(func,x):
    #获取二阶导数
    result=(get_2jie_daoshu(func,x+0.00001)-get_2jie_daoshu(func,x))/0.00001
    return result
def get_njie_daoshu(func,x,n):
    #获取n阶导数
    func_list=[]
    for i in range(n):
      if i == 0:
            def func_x(x):
                return (func(x+0.00001)-func(x))/0.00001
            func_list.append(func_x)
      else:
            func1=func_list[-1]
            def func_x(x):
                return (func1(x+0.00001)-func1(x))/0.00001
            func_list.append(func_x)
    return func_list[-1](x)


def main():
    func1=lambda x:x**5
    # print(get_2jie_daoshu(func1,4))
    print(get_njie_daoshu(func1,5,3))
if __name__ == '__main__':
    main()

把func_list.append(func_x)替换成func_list.append(copy.deepcopy(func_x))还是不行.....

sam喵喵 发表于 2021-5-28 20:47

这个单步调试通常都能解决。

hehao 发表于 2021-5-28 21:07

python难学吗

netspirit 发表于 2021-5-28 22:50

sam喵喵 发表于 2021-5-28 20:47
这个单步调试通常都能解决。

解决不了

fanvalen 发表于 2021-5-28 23:13

本帖最后由 fanvalen 于 2021-5-28 23:26 编辑

这写的啥垃圾 我他妈读不懂


一顿咔咔删除

fanvalen 发表于 2021-5-28 23:22

本帖最后由 fanvalen 于 2021-5-28 23:29 编辑

fanvalen 发表于 2021-5-28 23:13
这写的啥垃圾 我他妈读不懂

#coding=utf-8

是我不对
函数里再定义一个函数这是神马操作
直接写在appent()括号不好吗
还有你把一个列表的值拿来当一个函数用这样真的好吗
还有最后的return func_list[-1](x)这是什么东西(假设列表里面有值)你取最后一个值做函数名x做函数关键字这是神马操作

netspirit 发表于 2021-5-29 00:11

fanvalen 发表于 2021-5-28 23:22
是我不对
函数里再定义一个函数这是神马操作
直接写在appent()括号不好吗


第一个是一阶导数 第二个是二阶导数 以此推类....
因为我不知道怎么样写更好 所以才有这个帖子啊
要是我写好了还哪来这个帖子啊{:301_1008:}

缄默hl 发表于 2021-5-29 18:06

pyhthon默认限制迭代的次数
修改:
import sys
sys.setrecursionlimit(100000)
可以试试修改

fnv1c 发表于 2021-5-29 21:02

写的n阶导数算法有问题,不是调用深度限制的锅

fnv1c 发表于 2021-5-29 21:11

def naive_d(fn, n, x):
    if n == 1:
      return (fn(x + D) - fn(x)) / D
    return (naive_d(fn, n - 1, x + D) - naive_d(fn, n - 1, x)) / D
assert(abs(naive_d(lambda x: x**3,2,2)-3*4)<=0.01)
这种单侧逼近算高阶导数的误差突破天际,所以直接用最普通的递归就行了,没必要搞优化
页: [1]
查看完整版本: 关于python多阶求导递归算法的问题和优化