Python数值分析

线性方程组

使用numpy.linalg.solve求解以下方程式

4x1+3x2−5x3=2−2x1−4x2+5x3=58x1+8x2=−3\begin{aligned}4 x_{1}+3 x_{2}-5 x_{3} &=2 \\-2 x_{1}-4 x_{2}+5 x_{3} &=5 \\8 x_{1}+8 x_{2} &=-3\end{aligned} 4x1​+3x2​−5x3​−2x1​−4x2​+5x3​8x1​+8x2​​=2=5=−3​

import numpy as npA = np.array([[4, 3, -5], [-2, -4, 5], [8, 8, 0]])
y = np.array([2, 5, -3])x = np.linalg.solve(A, y)
print(x)

输出:

[ 2.20833333 -2.58333333 -0.18333333]

手工计算得出的结果与上述方法相同。 在后台,求解器实际上是在进行LU分解以获得结果。 您可以检查该函数的帮助,它需要输入矩阵为正方形且为全秩,即所有行(或等效地,列)必须线性独立。

片段14

尝试使用矩阵求逆法求解上述方程

A_inv = np.linalg.inv(A)x = np.dot(A_inv, y)
print(x)

输出:

[ 2.20833333 -2.58333333 -0.18333333]

我们还可以使用scipy包获得用于LU分解的LLL和UUU矩阵

片段15

获取上述矩阵A的LLL和UUU

from scipy.linalg import luP, L, U = lu(A)
print('P:\n', P)
print('L:\n', L)
print('U:\n', U)
print('LU:\n',np.dot(L, U))

输出:

P:[[0. 0. 1.][0. 1. 0.][1. 0. 0.]]
L:[[ 1.    0.    0.  ][-0.25  1.    0.  ][ 0.5   0.5   1.  ]]
U:[[ 8.   8.   0. ][ 0.  -2.   5. ][ 0.   0.  -7.5]]
LU:[[ 8.  8.  0.][-2. -4.  5.][ 4.  3. -5.]]

我们可以看到我们得到的LLL和UUU与我们在上述中手工得到的有所不同。 您还将看到LU函数返回的置换矩阵PPP。 此置换矩阵记录了我们如何更改方程式的顺序,以简化计算目的(例如,如果第一行中的第一个元素为零,则它不能成为枢轴方程,因为您不能将其他行中的第一个元素转换为 零。因此,我们需要切换方程式的顺序以获得新的枢轴方程式)。 如果将PPP与AAA相乘,您会发现此置换矩阵会逆转这种情况下方程的顺序。

将PPP和AAA相乘,看看置换矩阵对AAA有什么影响

print(np.dot(P, A))

输出:

[[ 8.  8.  0.][-2. -4.  5.][ 4.  3. -5.]]

插值和曲线拟合 | 方程根 | 微分 | 积分 | 初始值问题 | 两边值问题 | 对称矩阵特征值问题 | 优化

Python解偏微分方程

求解泊松方程

数学问题公式化:

−∇2u(x)=f(x),xin Ω,(1)-\nabla^{2} u(\boldsymbol{x})=f(\boldsymbol{x}), \quad \boldsymbol{x} \text { in } \Omega,\qquad(1) −∇2u(x)=f(x),x in Ω,(1)

u(x)=uD(x),xon ∂Ω,(2)u(\boldsymbol{x})=u_{\mathrm{D}}(\boldsymbol{x}), \quad \boldsymbol{x} \text { on } \partial \Omega,\qquad(2) u(x)=uD​(x),x on ∂Ω,(2)

其中,u=u(x)u=u(\boldsymbol{x})u=u(x) 为未知函数,f=f(x)f=f(\boldsymbol{x})f=f(x) 为规定函数,∇2\nabla^{2}∇2 为拉普拉斯算子(常写为 ∇\nabla∇),Ω\OmegaΩ 为空间域,∂Ω\partial \Omega∂Ω 为 Ω\OmegaΩ的边界。 泊松问题,包括偏微分方程 −∇2u=f-\nabla^{2} u=f−∇2u=f 和 ∂Ω\partial \Omega∂Ω 上的边界条件 u=uDu=u_{\mathrm{D}}u=uD​,是边界值问题的一个例子,在开始使用 FEniCS 解决它之前必须精确说明。

在坐标为 x 和 y 的二维空间中,我们可以写出泊松方程为

−∂2u∂x2−∂2u∂y2=f(x,y),(3)-\frac{\partial^{2} u}{\partial x^{2}}-\frac{\partial^{2} u}{\partial y^{2}}=f(x, y),\qquad(3) −∂x2∂2u​−∂y2∂2u​=f(x,y),(3)

未知数 u\boldsymbol{u}u 现在是两个变量的函数,u=u(x,y)u=u(x, y)u=u(x,y),在二维域 Ω\OmegaΩ 上定义。

泊松方程出现在许多物理环境中,包括热传导、静电、物质扩散、弹性杆的扭曲、无粘性流体流动和水波。 此外,该方程出现在更复杂的偏微分方程系统的数值分裂策略中,尤其是 Navier-Stokes 方程。

求解边界值问题(例如 FEniCS 中的泊松方程)包括以下步骤:

有限元变分公式

基于有限元方法,它是 PDE 数值解的通用且高效的数学机器。 有限元方法的起点是以变分形式表示的偏微分方程。

将 PDE 转化为变分问题的基本方法是将 PDE 乘以函数 vvv,在域 Ω\OmegaΩ 上对所得方程进行积分,并通过具有二阶导数的部分项进行积分。 乘以 PDE 的函数 vvv 称为测试函数。 要逼近的未知函数 uuu 称为试验函数。 术语试验和测试功能也用于程序。 试验和测试函数属于某些所谓的函数空间,这些函数空间指定了函数的属性

在本例中,我们首先将泊松方程乘以测试函数 vvv 并在 Ω\OmegaΩ 上积分:

−∫Ω(∇2u)vdx=∫Ωfvdx,(4)-\int_{\Omega}\left(\nabla^{2} u\right) v \mathrm{~d} x=\int_{\Omega} f v \mathrm{~d} x,\qquad(4) −∫Ω​(∇2u)v dx=∫Ω​fv dx,(4)

我们在这里让 dx 表示域 Ω 上积分的微分元素。 我们稍后将让 ds 表示在 Ω 边界上积分的微分元素。

当我们推导出变分公式时,一个常见的规则是我们尽量保持 uuu 和 vvv 的导数的阶数尽可能小。 在这里,我们有 uuu 的二阶空间导数,可以通过应用部分积分技术将其转换为 uuu 和 vvv 的一阶导数。 公式是这样写的

−∫Ω(∇2u)vdx=∫Ω∇u⋅∇vdx−∫∂Ω∂u∂nvds,(5)-\int_{\Omega}\left(\nabla^{2} u\right) v \mathrm{~d} x=\int_{\Omega} \nabla u \cdot \nabla v \mathrm{~d} x-\int_{\partial \Omega} \frac{\partial u}{\partial n} v \mathrm{~d} s,\qquad(5) −∫Ω​(∇2u)v dx=∫Ω​∇u⋅∇v dx−∫∂Ω​∂n∂u​v ds,(5)

其中 ∂u∂n=∇u⋅n\frac{\partial u}{\partial n}=\nabla u \cdot n∂n∂u​=∇u⋅n 是uuu 在边界外法线方向nnn 上的导数。

变分公式的另一个特点是测试函数 vvv 需要在解 uuu 已知的边界部分消失。 在当前问题中,这意味着整个边界 ∂Ω\partial \Omega∂Ω 上的 v=0v=0v=0。 因此,等式(5)右边的第二项消失了。 从等式(4)和(5)可以得出

∫Ω∇u⋅∇vdx=∫Ωfvdx,(6)\int_{\Omega} \nabla u \cdot \nabla v \mathrm{~d} x=\int_{\Omega} f v \mathrm{~d} x,\qquad(6) ∫Ω​∇u⋅∇v dx=∫Ω​fv dx,(6)

抽象有限元变分公式

事实证明,为变分问题引入以下规范符号是很方便的:找到 u∈Vu \in Vu∈V 使得

a(u,v)=L(v)∀v∈V^,(9)a(u, v)=L(v) \quad \forall v \in \hat{V},\qquad(9) a(u,v)=L(v)∀v∈V^,(9)

对于泊松方程,我们有:

a(u,v)=∫Ω∇u⋅∇vdx,(10)a(u, v)=\int_{\Omega} \nabla u \cdot \nabla v \mathrm{~d} x,\qquad(10) a(u,v)=∫Ω​∇u⋅∇v dx,(10)

L(v)=∫Ωfvdx,(11)L(v)=\int_{\Omega} f v \mathrm{~d} x,\qquad(11) L(v)=∫Ω​fv dx,(11)

实现代码(Python)

# Create mesh and define function space
mesh = UnitSquareMesh(8, 8)
V = FunctionSpace(mesh, ’P’, 1)
# Define boundary condition
u_D = Expression(’1 + x[0]*x[0] + 2*x[1]*x[1]’, degree=2)
def boundary(x, on_boundary):return on_boundary
bc = DirichletBC(V, u_D, boundary)
# Define variational problem
u = TrialFunction(V)
v = TestFunction(V)
f = Constant(-6.0)
a = dot(grad(u), grad(v))*dx
L = f*v*dx
# Compute solution
u = Function(V)
solve(a == L, u, bc)
# Plot solution and mesh
plot(u)
plot(mesh)
# Save solution to file in VTK format
vtkfile = File(’poisson/solution.pvd’)
vtkfile << u
# Compute error in L2 norm
error_L2 = errornorm(u_D, u, ’L2’)
# Compute maximum error at vertices
vertex_values_u_D = u_D.compute_vertex_values(mesh)
vertex_values_u = u.compute_vertex_values(mesh)import numpy as np
error_max = np.max(np.abs(vertex_values_u_D - vertex_values_u))
# Print errors
print(’error_L2 =’, error_L2)
print(’error_max =’, error_max)
# Hold plot
interactive()

有限元求解器库 | 子域和边界条件 | 改进泊松求解器

源代码

详情参阅 - 亚图跨际

Python数值和偏微分方程解相关推荐

  1. python如何求解微分方程_用Python数值求解偏微分方程

    1 引言 微分方程是描述一个系统的状态随时间和空间演化的最基本的数学工具之一,其在物理.经济.工程.社会等各方面都有及其重要的应用.然而,只有很少的微分方程可以解析求解,尤其对于偏微分方程,能解析求解 ...

  2. MATLAB使用Python数值和字符变量

    在 MATLAB 中使用 Python 数值类型 当调用接受数值输入参数的 Python 函数时,MATLAB 会将双精度值转换为最适合在 Python 语言中表示该数据的类型.例如,要调用 Pyth ...

  3. python数值类型_Python数值类型

    python数值类型 In programming, Data Types are an essential concept. Data of various types can be stored ...

  4. python数值类型教程_Python数值类型 int、float、complex 详解

    Python数值类型 int.float.complex 详解 Python数值类型:int.float.complex 在Python程序中,int.float和complex是三种十分重要的数值类 ...

  5. 常用的python数值处理函数,python常用数值函数总结

    一.工厂函数 数值工厂函数总结类(工厂函数) 操作 bool(obj)  返回obj对象的布尔值,也就是 obj.__nonzero__()方法                             ...

  6. python数值运算实例_Python矩阵常见运算操作实例总结

    本文实例讲述了Python矩阵常见运算操作.分享给大家供大家参考,具体如下: python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包. 一.numpy的导入 ...

  7. python 数值运算 m op n_python数值运算 四则运算

    数值运算 描述 获得用户输入的一个字符串,格式如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬ ...

  8. python数值类型的操作_Python学习笔记,数值类型及操作

    数值类型及操作 int类型数值大小不限: 整数的进制 1,整数类型正常为10进制 2,开头加0b or 0B 为二进制 3,加0o or 0O 为8进制 4,加0x 为16进制 浮点运算中存在不确定尾 ...

  9. python数值运算操作符也叫做内置操作符_Python的操作符 - osc_r1gtal48的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.数值运算符 python提供了9个基本的数值运算符,这些运算符由编译器直接提供,所以叫做内置运算符(操作符): 运算符 功能 + 加 - 减 * 乘 / 除 % 模 ** 幂 // 整除 -i 负 ...

  10. Python数值特征转换

    前言 经常用SparkML中特征转换,包括二值化.多项式展开.字符串-索引变换.独热编码.规范化.最大-最小缩放.分位数离散化等等一系列的操作,可如何用python来实现呢? 全面了解请看官网 离散值 ...

最新文章

  1. 计算机在人力资源管理中的应用论文,计算机人事管理论文
  2. python中的单例模式
  3. HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类
  4. ASP.NET+SQL创建存储过程
  5. Windows Server 笔记之备份与灾难恢复
  6. [状态压缩DP] COJ 1129 送货到家
  7. 十天冲刺---Day8
  8. 二叉树题目----1 前序中序后序遍历二叉树并返回相应的遍历(不是打印)
  9. 对钱感兴趣?聊聊互联网工资收入的组成
  10. ToString(C2)转人民币金额时的相关问题
  11. 分享一个最新思考的创业项目
  12. 7. CPU Scheduling
  13. 小程序发布上线流程_微信小程序开发到上线流程详解
  14. ps 条件动作添加 图层锁定和解锁
  15. 谷歌学术文献信息爬取及文献下载
  16. NAT模式实现虚拟机共享主机网络
  17. 北斗系统基础知识2(北斗一代定位原理详述)
  18. python爬虫中字符串开头b,u,r的含义
  19. VueJs探索之watch用法详解
  20. 【JavaScript】JavaScript之快速入门

热门文章

  1. linux查看网卡带宽命令,Linux查看网卡带宽的两个命令
  2. mindspore-ResNet101使用GPU进行训练时报错
  3. 哈工大威海数据结构实验
  4. Centos安装交叉编译工具链
  5. 七彩虹平板刷成android,七彩虹I803 Q1平板电脑刷机固件升级教程
  6. DVWA教程实践之Brute Force
  7. 前端开发工具Axure——Axure原型图查看
  8. 49个Excel常用技巧
  9. SQL Server 2012 下载与安装详细教程
  10. 计算机语言学和语料库语言学的区别,浅谈语料库语言学与外语教学