python科学计算最佳实践scipy指南_10-Python 科学计算_scipy 篇

本文介绍了使用Python的Scipy库进行科学计算的最佳实践,包括如何解决非线性方程组、数值积分以及常微分方程组的问题。通过实例详细解析了fsolve函数的应用,展示了如何计算定积分,并探讨了Lorenz方程的解法。
摘要由CSDN通过智能技术生成

课程概要:

1、非线性方程组

2、数值积分

3、常微分方程组

1、非线性方程组

'''

5 * x1 - 25 = 0

5 * x0 * x0 - x1 * x2 = 0

x2 * x0 -27 = 0

scipy.optimize fsolve(func, x)

# 所使用的scipy中的库optimize以及方法fsolve

# func 是自己构造的函数

'''

from scipy.optimize import fsolve

def func(x):

x0, x1, x2 = x.tolist()

return [

5 * x1 - 25,

5 * x0 * x0 - x1 * x2,

x2 * x0 -27

]

r = fsolve(func,[1,1,1])

print r

>>>

[ 3. 5. 9.]

'''

5 * x1 + 3 = 0

5 * x0 * x0 - 2sin(x1 * x2) = 0

x1 * x2 -1.5 = 0

'''

from scipy.optimize import fsolve

from math import sin

def func(x):

x0, x1, x2 = x.tolist()

return [

5 * x1 + 3,

5 * x0 * x0 - 2 * sin(x1 * x2) ,

x1 * x2 -1.5

]

r = fsolve(func,[1,1,1])

print r

>>>

[-0.63166288 -0.6 -2.5 ]

'''

5 * x1 + 3 = 0

5 * x0 * x0 - 2sin(x1 * x2) = 0

x1 * x2 -1.5 = 0

'''

from scipy.optimize import fsolve

from math import sin, cos

def func(x):

x0, x1, x2 = x.tolist()

return [

5 * x1 + 3,

5 * x0 * x0 - 2 * sin(x1 * x2) ,

x1 * x2 -1.5

]

def j(x):

x0, x1, x2 = x.tolist()

return [

[0, 5, 0], # 分别对x0, x1, x2 求偏导

[10* x0, -2 * x2 * cos(x1 * x2), -2 * x1 * cos(x1 * x2)],

[0, x2, x1]

]

r = fsolve(func, [1,1,1], fprime=j) # 使用求导矩阵传入时可以提高4倍效率

print r

>>>

[-0.63166288 -0.6 -2.5]

2、数值积分(定积分)

# 求半圆面积(定义求)

'''

pi * 1 *1 / 2

x * x + y * y = 1

y = (1 - x * x) ** 0.5

'''

import numpy as np

def func(x):

return (1 - x * x) ** 0.5

N = 10000

x = np.linspace(-1, 1, N)

dx = 2.0 / N

y = func(x)

m = dx * np.sum(y[:-1] + y[1:])

print m / 2 # m是整圆的面积

>>>

1.570637584

# 使用scipy的库进行计算

import numpy as np

from scipy import integrate

def func(x):

return (1 - x * x) ** 0.5 # x^2 + y^2 = 1

p, err = integrate.quad(func, -1, 1) # x 给定的区间

print p

>>>

1.57079632679

# 使用scipy的库进行计算

import numpy as np

from scipy import integrate

def func(x):

return (4 - x * x) ** 0.5 # x^2 + y^2 = 4

p, err = integrate.quad(func, -2, 2)

print p

>>>

6.28318530718

# dblquad:双重积分 trlquad:三重积分

'''

x * x+ y * y + z * z =1

z = (1 - x * x - y * y)**0.5

'''

from scipy import integrate

def func(x, y):

return (1 - x * x - y * y)**0.5

def func2(x):

return (1 - x * x)**0.5

m = integrate.dblquad(func, -1, 1, # x 的区间

lambda x: - func2(x),

lambda x: func2(x)) # y 的积分区间

print m

>>>

(2.0943951023931984, 2.3252456653390912e-14)

3、常微分方程组

dx/dt=σ(y-x)

dy/dt=x(ρ-z)-y

dz/dt=xy-βz

# σ = p , ρ = r , β= b

from scipy.integrate import odeint

import numpy as np

def lorenz(w, t, p, r, b):

x, y, z = w

return np.array([p * (y-x), x * (r-z) - y, x * y - b * z])

t = np.arange(0, 30, 0.01)

track1 = odeint(lorenz, (0.0, 1.00, 0.0), t, args=(10.0, 28.0, 3.0)) # 初始值,即w

## track2 = odeint(lorenz, (0.0, 1.01, 0.0), t, args=(10.0, 28.0, 3.0)) # args 为(p, r, b)

from mpl_toolkits.mplot3d import Axes3D

import matplotlib.pyplot as plt

fig = plt.figure()

ax = Axes3D(fig)

ax.plot(track1[:, 0], track1[:, 1], track1[:, 2])

plt.show()

# 改变轨迹值

ax.plot(track2[:, 0], track2[:, 1], track2[:, 2])

# 只有细微的差别,当改为1.10时差距就会很明显,但第二个图与视频中绘出的图有很大区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值