Python科学计算入门

1. 为什么选择Python?
Python已成为科学计算和数据分析的首选语言,原因包括:
- 语法简洁易学
- 丰富的科学计算库
- 强大的可视化能力
- 活跃的社区支持
2. 核心库介绍
2.1 NumPy - 数值计算基础
NumPy提供高性能的多维数组对象和相关工具。
import numpy as np
# 创建数组
arr = np.array([1, 2, 3, 4, 5])
# 数组运算
arr_squared = arr ** 2
# 矩阵运算
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B) # 矩阵乘法
2.2 SciPy - 科学计算工具
SciPy基于NumPy,提供更高级的科学计算功能:
from scipy import optimize, integrate
# 求解非线性方程
def func(x):
return x**2 - 4
root = optimize.fsolve(func, 1)
# 数值积分
result, error = integrate.quad(lambda x: x**2, 0, 1)
2.3 Matplotlib - 数据可视化
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('正弦函数')
plt.grid(True)
plt.show()
3. 工程应用实例
3.1 应力分析
import numpy as np
# 材料参数
E = 200e9 # 弹性模量 (Pa)
nu = 0.3 # 泊松比
# 应变
epsilon_x = 0.001
epsilon_y = 0.0005
# 应力计算(平面应力)
sigma_x = E / (1 - nu**2) * (epsilon_x + nu * epsilon_y)
sigma_y = E / (1 - nu**2) * (epsilon_y + nu * epsilon_x)
print(f"σx = {sigma_x/1e6:.2f} MPa")
print(f"σy = {sigma_y/1e6:.2f} MPa")
3.2 梁的挠度计算
import numpy as np
import matplotlib.pyplot as plt
# 简支梁中点集中载荷
L = 5.0 # 梁长度 (m)
P = 10000 # 载荷 (N)
E = 200e9 # 弹性模量 (Pa)
I = 1e-4 # 惯性矩 (m^4)
# 挠度方程
def deflection(x):
if x <= L/2:
return -P*x/(48*E*I) * (3*L**2 - 4*x**2)
else:
return -P*(L-x)/(48*E*I) * (3*L**2 - 4*(L-x)**2)
# 计算并绘图
x = np.linspace(0, L, 100)
y = [deflection(xi) for xi in x]
plt.plot(x, y)
plt.xlabel('位置 (m)')
plt.ylabel('挠度 (m)')
plt.title('简支梁挠度曲线')
plt.grid(True)
plt.show()
4. 数值求解微分方程
4.1 一阶ODE
使用scipy.integrate.odeint求解:
from scipy.integrate import odeint
# 定义微分方程 dy/dt = -k*y
def model(y, t, k):
dydt = -k * y
return dydt
# 初始条件
y0 = 5
k = 0.3
t = np.linspace(0, 20, 100)
# 求解
y = odeint(model, y0, t, args=(k,))
# 绘图
plt.plot(t, y)
plt.xlabel('时间')
plt.ylabel('y(t)')
plt.title('一阶ODE数值解')
plt.show()
5. 最优化问题
5.1 无约束优化
from scipy.optimize import minimize
# 目标函数
def objective(x):
return x[0]**2 + x[1]**2 + x[0]*x[1]
# 初始猜测
x0 = [1, 1]
# 优化
result = minimize(objective, x0, method='BFGS')
print(f"最优解: x = {result.x}")
print(f"最小值: f(x) = {result.fun}")
5.2 约束优化
from scipy.optimize import minimize
def objective(x):
return -x[0] * x[1] # 最大化 x*y
def constraint1(x):
return x[0] + 2*x[1] - 10 # x + 2y <= 10
con1 = {'type': 'ineq', 'fun': constraint1}
bounds = [(0, None), (0, None)]
result = minimize(objective, [1, 1],
method='SLSQP',
bounds=bounds,
constraints=con1)
6. 符号计算 - SymPy
对于需要符号推导的问题:
from sympy import symbols, diff, integrate, simplify
x, y = symbols('x y')
# 求导
f = x**3 + 2*x**2 - x
df = diff(f, x)
print(f"f'(x) = {df}")
# 积分
integral = integrate(f, x)
print(f"∫f(x)dx = {integral}")
# 化简
expr = (x**2 - 1)/(x - 1)
simplified = simplify(expr)
print(f"化简: {simplified}")
7. 推荐学习路径
- 基础:Python语法 → NumPy数组操作
- 进阶:SciPy科学计算 → Matplotlib可视化
- 应用:工程问题建模 → 数值求解
- 扩展:Pandas数据分析 → SymPy符号计算
8. 常用资源
- 官方文档:numpy.org, scipy.org
- 教程网站:Real Python, Python for Engineers
- 书籍:《Python科学计算》、《Numerical Python》
9. 总结
Python为工程师提供了强大而灵活的科学计算工具,掌握这些库可以大大提高工作效率。建议从简单问题入手,逐步深入复杂应用。
下期将介绍如何用Python进行有限元后处理。