0%

By Z.H. Fu
https://fuzihaofzh.github.io/blog/
先说明一下问题,marked是使用广泛的Markdown解析器,用于将Markdown语言翻译成HTML,而MathJax则用于页面公式渲染,其工作方式是在页面上识别LaTeX公式,然后将其转义。最近用Hexo在GitHub上搭建了自己的博客,由于内容需要,必须大量使用数学公式,于是决定使用MathJax进行渲染,因此需要在页面中嵌入MathJax,方法如下: 在header.html中加入:
javascript
1
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

由于MathJax默认没有开启单个美元符号的inline模式,需要手动打开,代码如下:

javascript
1
<script type="text/x-mathjax-config">MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});</script><script type="text/javascript" src="path-to-mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/

在用有限元方法求解偏微分方程的过程中,首先需要将微分方程写成它的弱形式(变分问题),然后通过求解变分问题,来得出原问题的解。本文旨在以椭圆偏微分方程为例,探讨其变分形式与原问题的等价性。

原始问题

用有限元法求解偏微分方程:

xβux+yβuy=f\frac{\partial}{\partial x}\beta\frac{\partial u}{\partial x}+\frac{\partial}{\partial y}\beta\frac{\partial u}{\partial y}=-f

计算域为Ω\Omega,在边界上满足以下边界条件:

{u=g0,onΓDnu=g1,onΓN\begin{cases} u&=g_0,\quad on \Gamma_D \\ \partial_n u&=g_1 ,\quad on\Gamma_N \end{cases}

其中,Γ\Gamma是计算域的边界,nn是边界外法线,而ΓD\Gamma_DΓN\Gamma_N分别叫做Dirichlet边界和Neumann边界,在这上面的边界条件分别称作做Dirichlet边界条件和Neumann边界条件。

能量方程

下面给出其“能量方程”,也就是对应的泛函JJ,(后面将证明变分δJ=0\delta J=0的解和原问题等价 )。至于这个方程怎么来的,我见过的所有将变分原理的都是直接给的,而我认为可以通过偏微分方程的形式,来拼凑,有兴趣的可以试一试。

J(u)=Ω(12(β(ux)2+β(uy)2)fu)dxdyJ(u)=\iint_\Omega(\frac{1}{2}(\beta(\frac{\partial u}{\partial x})^2+\beta(\frac{\partial u}{\partial y})^2)-fu)dxdy

变分法的思想认为,J(u)J(u)取极值的时候,就是原始问题的解,,J(u)J(u)取极值等价于说它的变分等于零,下面写出δJ=0\delta J=0

δJ(u)=Ω(βuxδux+βuyδuyfδu)dxdy\delta J(u)=\iint_\Omega(\beta\frac{\partial u}{\partial x}\frac{\partial \delta u}{\partial x}+\beta\frac{\partial u}{\partial y}\frac{\partial \delta u}{\partial y}-f\delta u)dxdy

Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/
以前理论力学课上做过一个实验,就是把各种圆的东西放到斜坡上让他们往下滚,问最后到达斜面底端的次序。

Rolling_Racers_-_Moment_of_inertia

可以看到,黄球最先滑下,其次是蓝柱,再次是红球,最后是绿柱。
各小球质量相等,直径相等,性质如下:

红球 黄球 绿柱 蓝柱
空心 实心 空心 实心

各个小球受重力相等,那么为什么会出现这种现象呢?
这就需要考虑惯性矩。我们知道质量是惯性的度量,表示一个物体受力之后的变化程度,惯性大的受影响小。而惯性矩则是描述物体受力矩作用后的反应,惯性矩大,则受力矩作用小。而惯性矩的定义为:

M=ρr2dvM=\int \rho \mathbf{r}^2dv

其中,r\mathbf{r}是到主轴的向量。因此,可以看出,质量越集中到边上,则r越大,则惯性矩越大,同等力矩下(这时重力产生的力矩一样大)当然是惯性矩小的实心的物体最先滑下(黄球和蓝柱),随后再是空心的东西。而柱体可以看成是球体把里面的东西减少给放到外面去了,因此,惯性矩比球体大。因此才有这种运动顺序。

By Z.H. Fu
https://fuzihaofzh.github.io/blog/

在高数中,我们学了格林公式(Threom):

Ω(QxPy)=LPdx+Qdy\iint_\Omega(\frac{\partial Q}{\partial x}-\frac{\partial P}{\partial y})=\oint_LPdx+Qdy

这个公式实际上是斯托克斯公式在二维的特殊形式。但除此之外,格林还有三个恒等式(Identity),在有限元中,这三个恒等式都有着非常重要的作用。

而分部积分作为微积分里面一个很基础的公式,能推倒出相当多的定理。本文就利用分部积分公式,推导格林的三个恒等式。这三个恒等式和格林公式没有任何关系

1. 分部积分公式

首先,复习一下分部积分公式:

u(x)v(x)dx=u(x)v(x)u(x)v(x)dx\int u(x)v'(x)dx=u(x)v(x)-\int u'(x)v(x)dx

或者直接写成:

udv=uvvdu\int udv=uv-\int vdu

2. 推广的分部积分公式(标量场、向量场混合分部积分公式)

Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/
今天来研究一下正定矩阵的几何意义。对于线性代数中的概念,还是要结合具体的问题,才能理解其物理意义。而最后往往能发现,矩阵往往是以前学的数学中的某个量的推广(一个标量或向量)。先来看一下正定矩阵的具体定义。 对于矩阵$\mathbf{M}$,若对任意向量$\mathbf{Z}$满足: $$\mathbf{z}^\mathrm{T}\mathbf{Mz}$$ 则称矩阵$\mathbf{M}$为正定矩阵。 下面就两个领域浅谈正定矩阵的几何意义。

多元函数微积分

还记得一元函数的泰勒展开么?公式如下:

f(x)=f(a)+f(a)1!(xa)+f(2)(a)2!(xa)2+++f(n)(a)n!(xa)n+Rn(x)f(x)=f(a)+\frac{f'(a)}{1!}(x-a)+\frac{f^{(2)}(a)}{2!}(x-a)^2+\cdots ++\frac{f^{(n)}(a)}{n!}(x-a)^n+R_n(x)

在一元微积分中,导数表示的是在某一点对原函数的最佳线性近似,那么在多远微积分中,同理,多元函数中也有一个用于表示对原函数最佳逼近的东西,
多元函数F:RnRmF:\mathbb{R}^n\mapsto \mathbb{R}^m,在PP点的最佳线性逼近为:

F(x)=F(p)+JF(xp)+o(xp)F(\mathbf{x})=F(\mathbf{p})+J_F(\mathbf{x}-\mathbf{p})+o(\mathbf{x}-\mathbf{p})

其中,JFJ_F就是雅克比矩阵(就是很多个偏导构成一个矩阵)定义如下:

JF=[F1x1F1x2F1xnF2x1F2x2F2xnFmx1Fmx2Fmxn]J_F=\begin{bmatrix} \frac{\partial F_1}{\partial x_1} & \frac{\partial F_1}{\partial x_2} & \cdots & \frac{\partial F_1}{\partial x_n}\\ \frac{\partial F_2}{\partial x_1} & \frac{\partial F_2}{\partial x_2} & \cdots & \frac{\partial F_2}{\partial x_n}\\ \vdots & \vdots & \ddots & \vdots\\ \frac{\partial F_m}{\partial x_1} & \frac{\partial F_m}{\partial x_2} & \cdots & \frac{\partial F_m}{\partial x_n} \end{bmatrix}

Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/

Python的matplotlib真心是个好用的东西,除了画一般的图形,他还支持LaTeX\LaTeX,我们可以利用这个来做一点酷酷的东西。下面给出数学公式插图的Python代码,生成结果还是蛮酷的:

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from pylab import *
eqs = []
eqs.append((r"$W^{3\beta}_{\delta_1 \rho_1 \sigma_2} = U^{3\beta}_{\delta_1 \rho_1} + \frac{1}{8 \pi 2} \int^{\alpha_2}_{\alpha_2} d \alpha^\prime_2 \left[\frac{ U^{2\beta}_{\delta_1 \rho_1} - \alpha^\prime_2U^{1\beta}_{\rho_1 \sigma_2} }{U^{0\beta}_{\rho_1 \sigma_2}}\right]$"))
eqs.append((r"$\frac{d\rho}{d t} + \rho \vec{v}\cdot\nabla\vec{v} = -\nabla p + \mu\nabla^2 \vec{v} + \rho \vec{g}$"))
eqs.append((r"$\int_{-\infty}^\infty e^{-x^2}dx=\sqrt{\pi}$"))
eqs.append((r"$F_G = G\frac{m_1m_2}{r^2}$"))
eqs.append((r"$F_y-\frac{dF_{y'}}{dx}=0$"))
eqs.append((r"$\delta J=\frac{\partial J}{\partial u_i}\delta u_i$"))
eqs.append((r"$\prod_{i=1}^n\times\sum_{j_i=1}^m\prod_{i=1}^na_{ij_i}$"))
eqs.append((r"$\int_\Omega f\nabla \cdot \mathbf{A} d\Omega$"))
eqs.append((r"$(x+y)^n=\sum_{k=0}^n\binom{n}{k}x^{n-k}y^k$"))
eqs.append((r"$\binom{n}{k_1,k_2,\cdots,k_m}$"))
figure(figsize=(20,10))
axes([0.025,0.025,0.95,0.95])

for i in range(20):
index = np.random.randint(0,len(eqs))
eq = eqs[index]
size = np.random.uniform(20,43)
x,y = np.random.uniform(0,1,2)
alpha = np.random.uniform(0.05,.15)
text(x, y, eq, ha='center', va='center', color="# 11557c", alpha=alpha,
transform=gca().transAxes, fontsize=size, clip_on=True)
xticks([]), yticks([])
show()

效果如图:

mbtutorial

by Z.H. Fu
https://fuzihaofzh.github.io/blog/

Fortran是人类最古老的的一门高级语言,而它的优点就在于能进行大规模的科学计算。Fortran对许多基础的数学计算都有非常多大的加速(比如对一个数组通式求正弦),因而很多科学计算程序都是用Fortran实现。而并行计算无疑能在此基础之上给Fortran一个更大的提速。本文主要讲解如何使用Fortran实现并行计算。

编译器的选择

一般来说,Fortran的编译器都是选择Intel的 Visual Fortran和VS结合实现(如果是用的Intel的CPU的话,这个加速相当完美,这是其他编译器无法超越的)。然而,由于我是要拿他来和Python做混编,Intel的编译器老是有问题。无奈之下,采用GNU的GFortran编译器。

IDE配置

目前GFortran最流行的编译器是Code::Blocks(这不是以前搞竞赛的时候用的么。。)点开设置-编译器如下图:

Read more »

by Z.H. Fu
https://fuzihaofzh.github.io/blog/

本文主要介绍多项式定理。在以前,我们学习过二项式定理,显然,多项式定理就是二项式定理的推广。
回忆二项式定理(Binomial theorem):

(x+y)n=k=0n(nk)xnkyk(x+y)^n=\sum_{k=0}^n\binom{n}{k}x^{n-k}y^k

其中,$$\binom{n}{k}=\frac{n!}{k!(n-k)!}$$
同理,对于一个多项式(x1+x2++xm)n(x_1+x_2+\cdots+x_m)^n我们有:

(x1+x2++xm)n=k1+k2++km=n(nk1,k2,,km)x1k1x2k2xmkm(x_1+x_2+\cdots+x_m)^n=\sum_{k_1+k_2+\cdots+k_m=n}\binom{n}{k_1,k_2,\cdots,k_m}x_1^{k_1}x_2^{k_2}\cdots x_m^{k_m}

其中(nk1,k2,,km)\binom{n}{k_1,k_2,\cdots,k_m}叫做多项式系数,且:

(nk1,k2,,km)=n!k1!k2!km!\binom{n}{k_1,k_2,\cdots,k_m}=\frac{n!}{k_1!k_2!\cdots k_m!}

n=2n=2时为二项式定理,陈景润与伍启期先后提出了证明。

By Z.H. Fu
https://fuzihaofzh.github.io/blog/

用Python处理数据,用matplotlib来做数据显示,比matlab美观的多,而且图标上能直接插入LaTeX\LaTeX。因而,采用matplotlib来显示数据是一种非常好的方式,但是,他的可配置的东西比较多,每次查起来都比较麻烦,故而编写了一个模板。其中中文的使用,参见《matplotlib中文加载方式》。效果及代码如下:

效果:

matplotlibtemplate.png

Read more »

By Z.H. Fu

https://fuzihaofzh.github.io/blog/
matplotlib默认是不支持中文的,今天测试了网上很多关于matplotlib加载中文的方法,大多数是在程序中加载字体文件,这种方法能实现部分中文的显示,但是切问录中显示图例的那个函数就没有预留这个加载字体的位置,先将这种方法放在下面:
Read more »