IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> [数值计算-9]:一元非线性函数求导数(数值微分)- 解析法与迭代法&Python法代码示例 -> 正文阅读

[Python知识库][数值计算-9]:一元非线性函数求导数(数值微分)- 解析法与迭代法&Python法代码示例

作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119824982


目录

1.?一元n次非线性方程

1.1?非线性函数

1.2 非线性函数案例

1.3 非线性函数的几何图形

2.? 导数与解析法求导数

2.1 导数的源头和初心

2.2?什么导数

2.3?导函数

2.4 解析法求导数

3. 迭代法求导数的基本原理

3.1 数值微分的基本思想

3.2 确定误差或收敛条件:对导数值求误差

3.3 迭代过程: 对h进行迭代

4. Python代码示例

4.1 案例1:迭代法求导数

4.2?案例2:通过迭代法求导,获取导数序列



1.?一元n次非线性方程

1.1?非线性函数

线性函数是一次函数的别称,则非线性函数即函数图像不是一条直线的函数。

非线性函数包括指数函数、幂函数、对数函数、多项式函数等等基本初等函数以及他们组成的复合函数

1.2 非线性函数案例

?y = f(x) = a3*x^3?+ a2*x^2?+? a0?

另a3?= 1, a2=-1, a0=-1;得到:

y=f(x)=x^{3} - x^{2} - 1?

1.3 非线性函数的几何图形

2.? 导数与解析法求导数

2.1 导数的源头和初心

在现实中,经常需要求函数的最大值、最小值、变速运动的瞬时速度,函数的切线等问题,是导数发现的源头与初心。

(1)瞬时速度

(2)切线与斜率

?

?

?

(3)函数求极值

?

上述三个问题的本质,都与一个非常基础的概念相关,就是函数的导数!!!

?导数也是深度学习领域,求损失函数最小值中的一个基础性的概念,梯度下降法的基础就是导数。

2.2?什么导数

?导数也称为微分!!!

2.3?导函数

以x为自变量,以函数f(x)在x处的导数值为因变量y,而构成的函数为x的导函数,记成f'(x)。

实际上,大多数初等函数,都可以通过原函数f(x)直接获取f(x)的导函数。

有了导函数f'(x),就可以直接求y=f(x)在任意点处的导数。

2.4 解析法求导数

解析法求导数,就是就是利用原函数,先人工得到导函数,然后,通过公式求解直接求解导数。

#导入库
from math import *
import time
import numpy as np
import matplotlib.pyplot as plt


# 一元N次非线性函数
# y=f(x) = x^3 - x - 1
def f(x):
    return(1.0*x**3 - 1.0*x**1 - 1) 

# 导函数:y=fv(x) =3x^2 - x
def fv(x):
    return(1.0*x**2 - 1.0*x**1 -1)  #导函数 


x_data = np.arange(-5,5,0.2)
y_data = []
print(x_data)

for x in x_data:
    y_data.append(fv(x))  #解析法依次求解
plt.scatter(x_data, y_data)

3. 迭代法求导数的基本原理

3.1 数值微分的基本思想

?

说明:x0 = a, x值为常量。

3.2 确定误差或收敛条件:对导数值求误差

Error = G(h_{k+1}) - G(h_{k}) < Accuracy

3.3 迭代过程: 对h进行迭代

?

?

?也就是说,迭代的是离X0的距离h,距离逐渐减少,趋于无穷小时,按照上述的公式计算得到的就是此处的导数。

距离减少的规则采用的是指数下降法,也就是说迭代的方式指数下降迭代,而不是线性下降。

这种方式在精度和速度两个方面获得很好的平衡。

4. Python代码示例

4.1 案例1:迭代法求导数

(1)源代码:

#导入库
from math import *
import time
import numpy
import matplotlib.pyplot as plt

# 一元N次非线性函数
# y=f(x) = x^3 - x - 1
def f(x):
    return(1.0*x**3 - 1.0*x**1 - 1) 


# 导函数:y=fv(x) =3x^2 - 1
def fv(x):
    return(3.0*x**2 - 1.0)  #导函数 

# 定义通过迭代法求导数的函数
# X0: 需要求导的位置
# accuracy: 精度
# debug: 调试开关
def f_iter(X0, accuracy = 0, debug = 0):
    #log data
    k = 0
    x_data  = []
    y_data  = []
    z_data  = []
    
    if (debug!=0):
        print("\n输入参数:X0={} , accuracy={}, debug={}".format(X0, accuracy, debug))
    #计算初始导数
    H0 = 1
    Hk = H0
    Gk = (f(X0 + Hk) - f(X0 - Hk))/(2*Hk)
    
    if (debug!=0):
        x_data.append(0)
        y_data.append(Gk)
        z_data.append(Hk)
    
    #迭代求导
    while True:
        k = k + 1  #记录迭代次数
        Hk = Hk/2                              #逐步逼近
        Gk_1 = Gk
        Gk = (f(X0 + Hk) - f(X0 - Hk))/(2*Hk) #导数值迭代
        Err = fabs(Gk - Gk_1)                 #求误差
        
        if (debug !=0):
            x_data.append(k)
            y_data.append(Gk)  
            z_data.append(Err)
        
        if (Err <= accuracy):
            break; 
            
    if (debug!=0):
        for x in x_data:
            print(x, y_data[x], z_data[x])
        print("\n迭代图示")
        plt.scatter(x_data, y_data)
    return Gk

accuracy = 0.00001

a = 2

print("解析法求导:", fv(a))
print("迭代法求导:", f_iter(a, accuracy, 1))

(2)输出结果

解析法求导: 11.0

输入参数:X0=2 , accuracy=1e-05, debug=1
0 12.0 1
1 11.25 0.75
2 11.0625 0.1875
3 11.015625 0.046875
4 11.00390625 0.01171875
5 11.0009765625 0.0029296875
6 11.000244140625 0.000732421875
7 11.00006103515625 0.00018310546875
8 11.000015258789062 4.57763671875e-05
9 11.000003814697266 1.1444091796875e-05
10 11.000000953674316 2.86102294921875e-06

迭代图示
迭代法求导: 11.000000953674316

(3)图形显示收敛过程

4.2?案例2:通过迭代法求导,获取导数序列

(1)源代码

# 定义存放导数序列的列表
x_data = np.arange(-5,5,0.2)
y_data = []

for x in x_data:
    #迭代法依次求导数
    y_data.append(f_iter(x, 0.0001, debug=0))   

# 展示导数序列
plt.scatter(x_data, y_data)

(2)图示输出(导函数)


作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119824982

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:19:48  更:2021-08-21 15:20:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:15:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码