Python学习-Scipy库求积分、复合积分、微分(半圆面积、球体体积、复合梯形积分、常微分方程求解)

20 篇文章 6 订阅

Python学习-Scipy库求积分函数、微分函数

积分integrate 面积:通用积分函数quad();体积:通用双积分函数dblquad()

目录

1、通用积分函数quad(),求半圆面积 x2+y2=r^2
2、通用双积分函数dblquad(),求球体体积
3、复合梯形积分 integrate.trapz()
4、求解常微分方程 solve_ivp()
导入库
from scipy import integrate
import matplotlib.pyplot as plt
import numpy as np
1、通用积分函数quad(),求半圆面积 x2+y2=r**2

参数介绍:
func: 指定被积函数
a,b: 积分上下限
args: 指定传递给func函数的参数,元组
full_output: 设置非0,返回积分操作相关信息,默认为0

返回值:
y: 积分的结果值
abserr: 估计结果中的绝对误差
message: 收敛信息
explain: 仅附加’cos’和’sin’加权和无限积分限制的相关解释信息

# 1、通用积分函数quad()
"""
参数介绍:
func: 指定被积函数
a,b: 积分上下限
args: 指定传递给func函数的参数,元组
full_output: 设置非0,返回积分操作相关信息,默认为0
...
返回值:
y: 积分的结果值
abserr: 估计结果中的绝对误差
message: 收敛信息
explain: 仅附加'cos'和'sin'加权和无限积分限制的相关解释信息
"""
# 求半圆面积 x^2+y^2=r^2
a = -2  # 积分下限
b = 2  # 积分上限


def m_circle(x, r):
    return np.sqrt(r**2 - x**2)


area1, _ = integrate.quad(m_circle, a, b, 2)
print(area1)
plt.figure(num=1, figsize=(5, 5))
plt.rc('font', family='simhei', size=15)  # 设置中文显示,字体大小
plt.rc('axes', unicode_minus=False)  # 该参数解决负号显示的问题
x = np.linspace(-2, 2, 180)
y = np.sqrt(4-x**2)
plt.plot(x, y, 'm', lw=2)
plt.fill(x, y, color='m', alpha=0.7)
plt.title('单位半圆面积为'+'{:.2f}'.format(area1))
plt.show()

输出
6.283185307179593

在这里插入图片描述

2、通用双积分函数dblquad(),求球体体积

参数介绍:
func: 含两个变量的被两重积分函数,第一参数y,第二参数x
a,b: 指定x中的积分限制a<b区域
gfun: 指定y的下边界曲线的函数,必须包含一个浮点型的x参数
hfun: 指定y的上边界曲线的函数,必须包含一个浮点型的x参数
args: 指定传递给func函数的额外参数(指第三个开始的参数)
epsabs: 直接传递到内部一维正交积分的绝对容差,默认1.49e-8
epsrel: 内部一维积分的相对容差,默认1.49e-8

返回值:
y: 积分的结果值
abserr: 估计结果中的绝对误差

# 2、通用双积分函数dblquad()
"""
参数介绍:
func: 含两个变量的被两重积分函数,第一参数y,第二参数x
a,b: 指定x中的积分限制a<b区域
gfun: 指定y的下边界曲线的函数,必须包含一个浮点型的x参数
hfun: 指定y的上边界曲线的函数,必须包含一个浮点型的x参数
args: 指定传递给func函数的额外参数(指第三个开始的参数)
epsabs: 直接传递到内部一维正交积分的绝对容差,默认1.49e-8
epsrel: 内部一维积分的相对容差,默认1.49e-8
...
返回值:
y: 积分的结果值
abserr: 估计结果中的绝对误差
"""
# 求球体体积


def g_func_c(x):
    return -np.sqrt(1-x**2)


def h_func_c(x):
    return np.sqrt(1-x**2)


def func_s(x,y):
    return np.sqrt(1-x**2-y**2)


volume, _ = integrate.dblquad(func_s, -1, 1, g_func_c, h_func_c)
volume, _ = integrate.dblquad(func_s, -1, 1, lambda x: -h_func_c(x), lambda x: h_func_c(x))

print(volume*2)
print(np.pi*4/3*1**3)
输出
4.188790204786397
4.1887902047863905
3、复合梯形积分 integrate.trapz()

参数说明:
y: 样本集合对象
x: 对应样本点的x值
dx: 指定采样点之间的间距
axis: 指定积分的轴

# 复合梯形积分  integrate.trapz(y,x=None,dx=1.0,axis=-1)
"""
参数说明:
y: 样本集合对象
x: 对应样本点的x值
dx: 指定采样点之间的间距
axis: 指定积分的轴
"""
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
area = integrate.trapz(y=np.abs(y), x=x)
print(area)
plt.plot(x, y, 'g--', linewidth=2)
plt.fill(x, y, color='b', alpha=0.7)
plt.show()
输出
3.9996643277879853

在这里插入图片描述

4、求解常微分方程 solve_ivp()

参数说明:
fun: 调用fun(t,y)函数,t是一个数值常量;y是一个数组
t_span: 2值元组,提供积分区间范围(t0,tf)
y0: 初始状态
method: 求解方法:‘RK45’ ‘RK23’ ‘Radau’ ‘BDF’ ‘LSODA’
t_eval: 计算连续解决方案存储需要的时间,受t_span影响
dense_output: 是否计算连续解决方案

返回值:
t: 时间点
y: t处的解

# 求解常微分方程  solve_ivp()
"""
参数说明:
fun: 调用fun(t,y)函数,t是一个数值常量;y是一个数组
t_span: 2值元组,提供积分区间范围(t0,tf)
y0: 初始状态
method: 求解方法:'RK45' 'RK23' 'Radau' 'BDF' 'LSODA'
t_eval: 计算连续解决方案存储需要的时间,受t_span影响
dense_output: 是否计算连续解决方案
...
返回值:
t: 时间点
y: t处的解
...
"""
plt.rc('font', family='simhei', size=15)  # 设置中文显示,字体大小
plt.rc('axes', unicode_minus=False)  # 该参数解决负号显示的问题


def f1(t, y):
    return np.sin(t**2+2)


t1 = np.linspace(-10, 10, 1000)
y0 = np.array([9])  # 初始值
y1 = integrate.solve_ivp(f1, (-10, 10), y0, method='LSODA', t_eval=t1)  # 求解
plt.plot(y1.t, y1.y[0], 'b')
plt.title('求一阶常微分方程')
plt.show()
输出

在这里插入图片描述

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值