吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1625|回复: 9
收起左侧

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

[复制链接]
netspirit 发表于 2021-5-28 20:14
本帖最后由 netspirit 于 2021-5-28 20:22 编辑

写了一个python求多阶导数的算法,总是报错
递归我不太熟悉,请问一下这类算法该怎么优化?
好像只要求导次数超过2就会报错了
用递归的方法我又不知道怎么写
我知道有些库可以直接算导数,我就是想研究一下算法的.
[Python] 纯文本查看 复制代码
#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
 楼主| netspirit 发表于 2021-5-28 22:50
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
这写的啥垃圾 我他妈读不懂

[mw_shl_code=python,true]#coding=utf-8

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

第一个是一阶导数 第二个是二阶导数 以此推类....
因为我不知道怎么样写更好 所以才有这个帖子啊
要是我写好了还哪来这个帖子啊
缄默hl 发表于 2021-5-29 18:06
pyhthon默认限制迭代的次数
修改:
import sys
sys.setrecursionlimit(100000)
可以试试修改

免费评分

参与人数 1热心值 +1 收起 理由
netspirit + 1 谢谢@Thanks!

查看全部评分

fnv1c 发表于 2021-5-29 21:02
写的n阶导数算法有问题,不是调用深度限制的锅
fnv1c 发表于 2021-5-29 21:11
[Python] 纯文本查看 复制代码
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吾爱币 +1 热心值 +1 收起 理由
netspirit + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-16 15:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表