关于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))还是不行..... 这个单步调试通常都能解决。 python难学吗 sam喵喵 发表于 2021-5-28 20:47
这个单步调试通常都能解决。
解决不了 本帖最后由 fanvalen 于 2021-5-28 23:26 编辑
这写的啥垃圾 我他妈读不懂
一顿咔咔删除 本帖最后由 fanvalen 于 2021-5-28 23:29 编辑
fanvalen 发表于 2021-5-28 23:13
这写的啥垃圾 我他妈读不懂
#coding=utf-8
是我不对
函数里再定义一个函数这是神马操作
直接写在appent()括号不好吗
还有你把一个列表的值拿来当一个函数用这样真的好吗
还有最后的return func_list[-1](x)这是什么东西(假设列表里面有值)你取最后一个值做函数名x做函数关键字这是神马操作 fanvalen 发表于 2021-5-28 23:22
是我不对
函数里再定义一个函数这是神马操作
直接写在appent()括号不好吗
第一个是一阶导数 第二个是二阶导数 以此推类....
因为我不知道怎么样写更好 所以才有这个帖子啊
要是我写好了还哪来这个帖子啊{:301_1008:} pyhthon默认限制迭代的次数
修改:
import sys
sys.setrecursionlimit(100000)
可以试试修改 写的n阶导数算法有问题,不是调用深度限制的锅 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]