码迷,mamicode.com
首页 > 编程语言 > 详细

用python实现二次函数的求导、求梯度、求模

时间:2018-06-08 10:36:38      阅读:1115      评论:0      收藏:0      [点我收藏+]

标签:变量   IV   elf   port   list   def   color   var   表示   

建立一个Function类,构造函数的参数是一个函数

其中part的功能是求偏导,var_index表示是第几个变量,val表示这些变量的值

diff的功能是方便一元函数求导

为方便梯度进行线性代数运算,在定义grad函数时,返回值转化成了numpy.array类型

#求导所得为近似结果

from numpy import *

#定义Function类
class Function:
    def __init__(self, _f):
        self.fun = _f

    def value(self, val):
        return self.fun(val)

    #求偏导
    def part(self, var_index, val):
        a = self.fun(val)
        b = a + 1
        i = 0
        e = 1
        e1 = 0.1
        while e > 10 ** (-6) or e > e1:
            e1 = e
            a = b
            val_ = list(val)
            val_[var_index] += 10 ** i
            m = self.fun(val_)
            n = self.fun(val)
            b = (m - n) / 10 ** i
            i -= 2
            e = abs(b - a)
        return a

    #一元函数求导
    def diff(self, val):
        a = self.fun(val)
        b = a + 1
        i = 0
        e = 1
        e1 = 0.1
        while e > 10 ** (-6) or e > e1:
            e1 = e
            a = b
            val_ = val + 10 ** i
            m = self.fun(val_)
            n = self.fun(val)
            b = (m - n) / 10 ** i
            i -= 2
            e = abs(b - a)
        return a

    #求梯度
    def grad(self, val):
        g = array(val)
        for i in range(0, g.size):
            g[i] = self.part(i, val)
        return array(g)

    #求模
    def norm(self, val):
        s = 0
        for x in self.grad(val):
            s += x ** 2
        return sqrt(s)

 

用python实现二次函数的求导、求梯度、求模

标签:变量   IV   elf   port   list   def   color   var   表示   

原文地址:https://www.cnblogs.com/kisetsu/p/9145393.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!