分类为'数字之美'的全部存档

复化Gauss-Legendre求积

高斯型求积公式是数值积分中一个比较成熟的想法. 速度快, 精度高, 公式优雅.

一般Gauss-Legendre求积公式

对于一般的Gauss型求积公式

\int_a^b f(x) \rho (x)\,dx \approx \sum_{k=0}^{n} A_k f(x_k)

取权函数\rho (x)=1, 积分区间设定为\left[-1, 1\right], 则得到一般的Gauss-Legendre求积公式
\int_{-1}^{1} f(x) dx \approx \sum_{k=0}^{n} A_k f(x_k).

取Legendre多项式的零点作为Gauss点, 通过计算得到Gauss点个数n=2n=3时的求积公式
\int_{-1}^{1} f(x)\,dx \approx f(-\frac{1}{\sqrt{3}})+f(\frac{1}{\sqrt{3}})

以及
\int_{-1}^{1} f(x)\,dx \approx \frac{5}{9} f(-\frac{\sqrt{15}}{5})+\frac{8}{9}f(0)+\frac{5}{9}f(\frac{\sqrt{15}}{5}).

变量替换方法

上述分析中, 积分区间固定为\left[-1, 1\right], 实际应用时做变量替换

x=\frac{a+b}{2}+\frac{b-a}{2}t.

将被积区间\left[a, b\right]化为\left[-1, 1\right].

复化Gauss-Legendre求积公式

将被积区间m等分, 记h=\frac{b-a}{m}, x_k=a+kh, k=0, 1, 2 \ldots, m. 作变换

x=\frac{x_k+x_{k-1}}{2}+\frac{h}{2}\,t,

在每个小区间上应用Gauss-Legendre公式, 累加即得复化Gauss-Legendre求积公式

\int_a^b f(x)\,dx=\frac{h}{2}\sum\sum A_k f(x_k).

不妨设

G(t)=f(\frac{x_k+x_{k+1}}{2}+\frac{h}{2}\,t),

则有:

Gauss点个数n=2时,

\int_a^b f(x)\,dx\approx\frac{h}{2}\sum G(-\frac{1}{\sqrt{3}})+G(\frac{1}{\sqrt{3}}),

Gauss点个数n=3时,

\int_a^b f(x)\,dx\approx\frac{h}{2}\sum \frac{5}{9}G(-\frac{\sqrt{15}}{5})+\frac{8}{9}G(0)+\frac{5}{9}G(\frac{\sqrt{15}}{5}).

总结复化Gauss-Legendre求积过程如下:

1. 分割区间, 记录区间端点值;
2. 通过查表或求解非线性方程组, 在所有小区间上, 将Gauss系数和Gauss点的值代入变量替换后的公式;
3. 将所有区间的结果累加, 即得到整个区间上的积分近似值.

针对Gauss点个数n=2n=3的复化Gauss-Legendre求积公式编写的一个简单的MATLAB函数 compgauss() 如下:

?Download compgauss.m
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
26
27
28
29
30
31
32
33
34
function [ ] = compgauss(a, b, n)
% Composite Gauss Integration
% Equation Type: n=2, n=3
% Coded by Nan.Xiao 2010-05-25
% Step.1 Divide Interval
% Step.2 Calculate
% Step.3 Sum Results
format long
f = @(x) exp(x).*sin(x);
h=(b-a)/n;
xk=zeros(n+1,1);
xk(1,1)=a;
xk(n+1,1)=b;
fk1=zeros(n,1);
fk2=zeros(n,1);
for i=1:n-1
    xk(i+1,1)=a+h*i;
end
for j=1:n
    fk1(j)=f((xk(j)+xk(j+1))/2+(h/2)*(-1/sqrt(3)))+...
        f((xk(j)+xk(j+1))/2+(h/2)*(1/sqrt(3)));
end
for r=1:n
    fk2(r)=(5/9)*f((xk(r)+xk(r+1))/2+(h/2)*(-sqrt(15)/5))+...
        (8/9)*f((xk(r)+xk(r+1))/2+(h/2)*(0))+...
        (5/9)*f((xk(r)+xk(r+1))/2+(h/2)*(sqrt(15)/5));
end
mysum1=h*sum(fk1)/2;
mysum2=h*sum(fk2)/2;
disp('Result of 2 Nodes:')
disp(mysum1);
disp('Result of 3 Nodes:')
disp(mysum2);
end

总结

1. Gauss求积公式较一般的机械求积公式的进步之处, 在于其针对插值型求积公式进行了改进. Gauss公式将插值节点设为未知, 成功地将代数精度由n次提高到2n+1次. 计算过程简单, 速度快, 达到要求精度所需步骤较少.

2. (复化) Gauss 求积的一个问题在于, 增加Gauss点个数, 继续求解Gauss系数和Gauss点值时, 需要解一系列非线性方程组. 其解析解较难求得. 而取数值解作为公式中的参数, 不如解析解理想.

时间换空间/空间换时间?

经常看到网上有人在讨论算法时用时间换空间/空间换时间的说法. 可惜神人们使用的例子都很专业, 再加上一两句晦涩而潇洒的写法, 我等凡人基本上就很难看懂了. 今天在实现数值积分中的龙贝格 (Romberg) 算法时, 算是遇到了一个这方面有点关系的问题, 简单记录一下.

首先上一段800字的原理说明:

……

由于作者心里很清楚读者将会人肉Skip上面一段, 所以这里直接人肉省略其中的797字.

如果执意想看一下, 参考 Wikipedia 好了.

下面是一个很好懂的 MATLAB 实现:

?Download romberg.m
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
function [ ] = romberg(aa, bb, kk, iter)
% Romberg Integral Method
% Coded by Nan.Xiao 2010-05-23
% Step 1. Calc TrapeStep
% Step 2. Calc Romberg Method
% Step 3. Extract Diagnal & Output
function [ ] = trapestep(a, b, k)
    format long
%     function y = f(x)
%         y=(2/sqrt(pi))*exp(-x);
%     end
%     Examples Can Also Be:
%     function y = f(x)
%         y=x*sin(x);
%     end
%     Or
    function y = f(x)
        y=x*sqrt(1+x.^2);
    end
k1=2^(k-1);
temp=zeros(k,k1);
mysum=zeros(k,1);
t=zeros(k+1,1);
for i=1:k
    for j=1:(2^(i-1))
    temp(i,j)=f(a+(((2*j-1)*(b-a))/(2^i)));
    end
end
for p=1:k
    mysum(p,1)=sum(temp(p,:));
end
t(1,1)=0.5*(f(a)+f(b));
for q=2:k+1
    t(q,1)=(0.5*t(q-1,1))+(((b-a)*mysum(q-1,1))/(2^(q-1)));
end
end
    format long
trapestep(aa, bb, kk);
diagonal=zeros(kk,1);
tt=zeros(kk,kk);
for v=1:kk
    tt(v,1)=t(v,1);
end
for r=2:kk
for s=2:r
    tt(r,s)=((4^(s-1)*tt(r,s-1))-tt(r-1,s-1))/(4^(s-1)-1);
end
end
save('tt.txt', 'tt', '-ascii', '-double'); % Save the Table
% Extract Table Diagonals
for w=1:kk
    diagonal(w,1)=tt(w,w);
end
disp('Romberg Table Diagonals:')
disp(diagonal);
% Output Final Result
cc=2;
while abs(diagonal(cc,1)-diagonal(cc-1,1))>=iter || abs(diagonal(cc+1,1)-diagonal(cc,1))>=iter
    cc=cc+1;
end
disp('The Final Result is:');
disp(diagonal(cc,1));
end

与网上其他程序不同, 我在这里没有做太多的判断, 将二分的次数k作为一个参数手动设定, 是为了观察计算的具体过程. 同时, 为了方便移植, 仅使用最基本的矩阵操作语句, 没有使用 MATLAB 中的 feval() 函数, 要改变被积函数, 直接修改函数体. 最终目的是, 我要取得计算产生的含有T_m^{(k)}的表格, 以方便完成笔头的作业. 懒到一定程度了是不是?
继续阅读’时间换空间/空间换时间?’

In god we trust, or in love?

You don’t have to believe in God, but you should believe in The Book.

        ——P. Erdos

即日启程, 在接下来几天没有网络的日子里, 我深信亲情能够温暖人心. 临行前突然又想写点东西. 标题的前半句出自《圣经》, 后半句与本文有点关系, 似乎还是王小帅一部电影的英文名. 中间还少了一环, 这环就是数学. 大神P.Erdos[1] 不太相信上帝, 但他相信世界上有一本超穷的“天书”(The Book), 那里包含了所有数学定理最简洁、最漂亮、最优雅的证明. 他对一个证明的最高赞誉就是:

It is from The Book!

按照God→Math→Love的逻辑, 爱亦应有自己的数学表述. 有了数学表述自然要可视化一下. 笛卡尔心形线令人心碎的爱情故事不知其真实程度, 不过确实够浪漫的. 不过这隐函数都学完了还画心形线就太out了, 今天咱也浪漫一把, 画个隐函数方程生成的三维心. 不知此图能否有幸入选The Book的图形部分?

MATLAB_3D_heart

图1: MATLAB生成三维心形

原始方程:

MATLAB_3D_heart_formula
自己画一个?

?View Code SCILAB
1
2
3
4
5
[x,y,z]=meshgrid(linspace(-3,3,120));
f=(x.^2+(9*y.^2)./4+z.^2-1).^3-((9*y.^2).*(z.^3))./80-(x.^2).*(z.^3);
p=patch(isosurface(x,y,z,f,0));
set(p, 'FaceColor', 'r', 'EdgeColor', 'n');
daspect([1 1 1]);view(3);camlight('right');lighting phong

[1] P.Erdos (1913-1996), 当代最伟大的数学家之一, 他一生中同485位合作者发表了1475篇数学论文. Erdos的研究领域主要是数论和组合数学, 但他的论文中涵盖的学科有逼近论、初等几何、集合论、概率论、数理逻辑、格与序代数结构、线性代数、群论、拓扑群、多项式、测度论、单复变函数、差分方程与函数方程、数列、Fourier分析、泛函分析、一般拓扑、代数拓扑、统计、数值分析、计算机科学、信息论等等. 美国数学学会(AMS)的《数学评论》杂志曾把数学划分为约六十个分支, Erdos的论文涉及了约40%.

斯人已逝, 思想长存.

2010年春节前

雪夜哈尔滨

望生塔

顾术理,在上海复兴中学上高三时参加了新概念作文比赛,写了一篇文章,《望生塔上的歌》,不见太多技巧,记忆犹新,摘录其中一节如下:

八十年的车票

梦中,我上了一列火车,在车上遇到一位白胡子老人。我问老人:“这列火车开往何方?”

老人说:“终点站。”

我又问:“还有多久能到终点?”

老人说:“我快到了,你还有六十多年。”

“六十多年?”我惊讶地问。

老人说:“每个人都拿着一张火车票,期限都是八十年。”

“那我可以中途下车吗?”我问。
老人笑着说:“可以,路途中有无数站,你可以从任何一站下去,从任何一站上来,也可以换车,但这些车都开往同一个终点。”

我好奇地问:“您去过多少个站?还想去哪些站?”

老人笑笑:“这个问题我从来不想,我乘车时,总是看见话多乘客一直在问这个问题,根本没有注意到时间就这样逝去,一转眼便到了终点。他们总是背负着过去,期盼着未来,却偏偏忘记了现在。”

“您老是说乘车时不问前程后路,只问是否活在当时?”我问。

老人微笑颔首。
我要在中途一站下车了,老人抚摸着胡子笑道:“记住,不要握着车票在站台上前瞻后顾,登上一列你认为应该上的火车。否则,你会错过沿途许多美丽的风景。

否则,你会错过沿途许多美丽的风景。 寓言式的答案。

life_and_bottle

就像选专业吧,两个都不错,各有长处,各有短板。让自己纠结了好一阵子。让命运来决定,也许是一个不错的想法,但是也有了一些宿命论的味道。联想到自己现在的状态,确实说的太多,做得太少,没了高中时那么明确的目标。总是想,是时候踏踏实实做一些事情了,可什么时候是时候呢?比如刚刚考完的数学分析,闭区间单调必可积。作为一个人,我们时刻都要做出选择,都有做出选择的权利,现在有的选择,那时没的选择。但是有的选不一定就比没的选好出许多。就像你把单选题的选项全部排除那么鱼闷。选择的意义何在?《The Matrix》表达了一种选择论和因果论相调和的观点。设计者Architect和先知,同Zion里的人类还有Matrix一样,都无法参透选择的奥妙。正如 我们曾经无话不说,所以现在无话可说。就让C++程序设计基础来的更猛烈些吧。

pencil_and_choices

不过有一个基本点倒是让人欣慰,既然做出了选择,做下去总没有错了。在挫折和斗志重燃的过程中建立起自己对人生的一点思考,也不是很坏呀。就像Weierstrass把分析严密化的过程,很吐很不开心,但是结果很美。确实,美是唯一标准。

看到Revenge of the Fallen的OST出来了,《New Divide》of Linkin,虽然有点单纯延续前作之嫌,也无妨让我们一起Across This New Divide. 2009年6月24日,见证Michael Bay这小子的坏笑。

lockheed_martin_F22

Lockheed Martin公司生产的F22 Raptor,第四代战机。成本1.377亿美元/架,气动外形设计先进,拥有超音速巡航能力。

(本文最初发表于xiaonei.com)

空间解析的老师实在是很nice~

第一节课刚下课,我就迫不及待写个小日志赞一下何伟老师,在第一堂课上,讲到了数学建模,图片数字化,MATLAB,矩阵,集合论的危机,范畴论,控制论,自动化,小孔成像 ..
爱死你了!

第二节课又讲到了三次数学危机,拓扑,博弈论,纳什平衡,公理化数学,陈省身,吴文俊,非欧几何,泰勒公式,逻辑,量变质变,泛函分析!哈哈,巨合俺的口味!

(本文最初发表于xiaonei.com)