程序员用的数学
程序员用的数学
作者:韩守庆 著
摘要/内容:
第1章 第三方数学软件:V5.5测试(20131204)
第2章 OpenGL和D3D数学基础:线性代数、空间解析几何、局部微分几何、泛函分析、计算机图形学等3D数学基础知识
第3章 算法分析
第4章
第5章
第6章
第7章
第8章
第9章
第10章
第11章
第12章
第13章
第14章
chap1
功能:求符号函数对某一变量的导数(Symbolic Expression Derivation)
f="x^8"
f = "x^8"
SymExpressionDerivation(f)
ans = "8*x^7"
【
用Mathematica进行求导运算
在Mathematica系统中,用D[f,x]表示f(x)对x的一阶导数,用D[f,{x,n}]表示f(x)对x的n阶导数.
In[1]: =D[x^8,x]
Out[1]=8x^7
In[2]:=D[x^8*Sin[x],x]
Out[2]=x^8Cos[x] +8x^7Sin[x]
】
功能:一元连续函数的积分函数.
格式:Integral(f,a,b)
说明:f为符号函数句柄,其未知数变量默认为x,积分区间为[a,b],当a或b为inf或-inf时,认为是无穷远
f="x/(4+x^2)"
f = "x/(4+x^2)"
Integral(f,0,1)
ans =
[ 0.11157177565710 ]
【
Mathematica数值积分函数为NIntegrate,其调用格式为:
NIntegrate[f,{x,xmin,xmax}]
解
In[1]:=NIntegrate[x/(4+x^2),{x,0,1}]
Out[1]=0.111572
】
功能:数据拟合
格式:polyfit(x,y,n,erro);polyfit(x,y,n);polyfit(x,y)
进行三次多项式拟合
a=[1 2 3 4]
a =
[ 1.00000000000000 2.00000000000000 3.00000000000000 4.00000000000000 ]
b=[16 25 46 85]
b =
[ 16.0000000000000 25.0000000000000 46.0000000000000 85.0000000000000 ]
polyfit(a,b,3)
ans=
"1.00000190734863*x^3-7.62939453125E-06*x^2+2*x+13.0000305175781"
NormResiduals=2.21203107924332E-05
【
Mathematica求插值多项式的函数为InterpolatingPolynomial ,其调用格式为:
InterpolatingPolynomial[数据表,变量]
已知自变量x=1, 2 , 3, 4时,因变量y=16, 25, 46, 85,求一个三次插值多项式逼近该函数,并求y(2.5).
解 In[1]:=data={{1,16},{2,25},{3,46},{4,85}}
In[2]:=f=InterpolatingPolynomial[data,x]
In[3]:=f=Expand[%]
In[4]:=f/.x→2.5
Out[1]={{1, 16}, {2, 25}, {3, 46}, {4, 85}}
Out[2]=16 + (–1 + x) (9 + (–2 + x) (3 + x))
Out[3]=13 + 2 x + x3
Out[4]=33.625
】
功能:采用Steffensen算法求解一元非线性方程根
f="sin(x)"
f = "sin(x)"
x=SolveRootSteffensen(f)
x =
[ 3.14159265358979 1.2246063538E-16 ]
【
Mathematica求方程sinx=0在x=3附近的一个根.
解
In[1]:=FindRoot[Sin[x]= =0,{x,3}]
Out [1]={x →3.14159}
】
功能:求矩阵的秩
格式:rank(a);rank(a,n)
说明:a为矩阵变量,n为误差纠正值[1-18],建议n=10
a=[1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
-17 18 19 20]
a =
[ 1.00000000000000 2.00000000000000 3.00000000000000 4.00000000000000
5.00000000000000 6.00000000000000 7.00000000000000 8.00000000000000
9.00000000000000 10.0000000000000 11.0000000000000 12.0000000000000
13.0000000000000 14.0000000000000 15.0000000000000 16.0000000000000
-17.0000000000000 18.0000000000000 19.0000000000000 20.0000000000000 ]
rank(a)
ans =
[ 3.00000000000000 ]
a=[1 5 9 13
17 2 6 10
14 18 3 7
11 15 19 4
8 12 16 20]
a =
[ 1.00000000000000 5.00000000000000 9.00000000000000 13.0000000000000
17.0000000000000 2.00000000000000 6.00000000000000 10.0000000000000
14.0000000000000 18.0000000000000 3.00000000000000 7.00000000000000
11.0000000000000 15.0000000000000 19.0000000000000 4.00000000000000
8.00000000000000 12.0000000000000 16.0000000000000 20.0000000000000 ]
rank(a)
ans =
[ 4.00000000000000 ]
b=[1 5 9 13 17
2 6 10 14 18
3 7 11 15 19
4 8 12 16 20]
b =
[ 1.00000000000000 5.00000000000000 9.00000000000000 13.0000000000000 17.0000000000000
2.00000000000000 6.00000000000000 10.0000000000000 14.0000000000000 18.0000000000000
3.00000000000000 7.00000000000000 11.0000000000000 15.0000000000000 19.0000000000000
4.00000000000000 8.00000000000000 12.0000000000000 16.0000000000000 20.0000000000000 ]
rank(b)
ans =
[ 2.00000000000000 ]
Java通过JNI计算矩阵的秩:
C:\>javac Foo.java
C:\>java Foo
ret45=3
ret54=4
public native static int brank(double[] a,int m,int n);
double a[]=new double[]{1,5,9,13,17,2,6,10,14,18,3,7,11,15,19,4,8,12,16,20};
int ret45=foo.brank(a,4,5);
System.out.println("ret45="+ret45);
int ret54=foo.brank(a,5,4);
System.out.println("ret54="+ret54);
JNIEXPORT jint JNICALL Java_Foo_brank(JNIEnv *env, jclass, jdoubleArray a, jint m, jint n)
{
jdouble* pa = (env)->GetDoubleArrayElements(a, 0 );
int ret=brank(pa,m,n);
(env)->ReleaseDoubleArrayElements(a, pa, 0 );
return ret;
}
Γ(x+yi)=?
Γ(1.0+0.1i)=0.9902-0.05702i
Γ(1.1+0.1i)=0.9959+0.0422i
Γ(1.2+0.1i)=0.912-0.02614i
Γ(1.3+0.1i)=0.8923-0.01492i
Γ(1.4+0.1i)=0.8827-0.005273i
Γ(1.5+0.1i)=0.8821+0.00334i
Γ(1.6+0.1i)=0.8896+0.01132i
Γ(1.7+0.1i)=0.9048+0.01896i
Γ(1.8+0.1i)=0.9276+0.02652i
Γ(1.9+0.1i)=0.9579+0.0342i
功能:伽马函数求值
格式:Gamma(x)
说明:函数成功返回对应的伽马函数值.但是注意,x不能为负整数.
Gamma(1.0+0.1i)
ans = 0.990206629588383 - 0.0568238087537157i
Gamma(1.1+0.1i)
ans = 0.943739327403351 - 0.0397232864251407i
Gamma(1.2+0.1i)
ans = 0.912006443791646 - 0.0261438920264667i
Gamma(1.3+0.1i)
ans = 0.892279466286237 - 0.0149202316065137i
Gamma(1.4+0.1i)
ans = 0.882717571841338 - 0.00527341904680261i
Gamma(1.5+0.1i)
ans = 0.882093197098701 + 0.00334036310197866i
Gamma(1.6+0.1i)
ans = 0.889620571044311 + 0.0113181814096069i
Gamma(1.7+0.1i)
ans = 0.904846700776421 + 0.018964119204293i
Gamma(1.8+0.1i)
ans = 0.927581717215409 + 0.0265233851521887i
Gamma(1.9+0.1i)
ans = 0.957855012678436 + 0.0342048829172188i
功能:求四元变量的自然对数
格式:QuaternionLog(A)
a=[1 2 3 4]
a =
[ 1.00000000000000 2.00000000000000 3.00000000000000 4.00000000000000 ]
QuaternionLog(a)
ans =
[ 1.70059869083108 0.51519029266408 0.77278543899612 1.03038058532817 ]
a=[3 2 0 0]
a =
[ 3.00000000000000 2.00000000000000 0.00000000000000 0.00000000000000 ]
QuaternionLog(a)
ans =
[ 1.28247467873077 0.58800260354756 0.00000000000000 0.00000000000000 ]
用VB_D3DXQuaternionLn计算:
Ln{1,2,3,4}={1,2,3,0}
Ln{3,2,0,0}={4.712389,3.141593,0,0}
复数3+2i的自然对数为:1.282475,0.588003
功能:求四元变量的指数次方
格式:QuaternionExp(A)
a=[1 2 3 4]
a =
[ 1.00000000000000 2.00000000000000 3.00000000000000 4.00000000000000 ]
QuaternionExp(a)
ans =
[ 1.69392272368330 -0.78955962454155 -1.18433943681234 -1.57911924908312 ]
a=[1 2.1 0 0]
a =
[ 1.00000000000000 2.10000000000000 0.00000000000000 0.00000000000000 ]
QuaternionExp(a)
ans =
[-1.37231399230213 2.34644633551727 0.00000000000000 0.00000000000000 ]
用VB_D3DXQuaternionExp计算:
Exp{1,2,3,4}={-.1509214,-.3018427,-.4527641,-.825299}
Exp{1,2.1,0,0}={.3130659,.6574383,0,-.6853938}
exp(1,2.1)= -1.37231+2.34645i
功能:求2个数的算术-几何平均数(Arithmetic - Geometric Mean)
MeanArithmeticGeometric(1.414214,1)
ans = 1.19814043607983
MeanArithmeticGeometric(1,1.414214)
ans = 1.19814043607983
MeanArithmeticGeometric(1,0)
ans = 2.77555756156289E-17
MeanArithmeticGeometric(1,0.707107)
ans = 0.847213204591294
【
//AGM(A0=1.414214+0.000000i;G0=1.000000+0.000000i)=1.198157+0.000000i或AGM(G0=1.000000+0.000000i;A0=1.414214+0.000000i)=1.198157+0.000000i,注意:A1=1.2071067811865475244008443621048,G1=1.1892071150027210667174999705605
//AGM(A0=1.000000+0.000000i;G0=0.000000+0.000000i)=0.000122+0.000000i,即AGM(1,0)=0=>K(1)=+∞
//AGM(A0=1.000000+0.000000i;G0=0.707107+0.000000i)=0.847225+0.000000i,即AGM(1,sqrt(2)/2)≈0.847=>K(sqrt(2)/2)≈1.854
】
双纽线周率~ω是Gauss(1799年)由研究算术几何平均数时发现的量,作为自守形式/椭圆函数论发端的事件是应该被纪念的。
高斯发现的是AGM(sqrt(2),1)=π/~ω这个等式。更一般地Gauss得到了AGM(a,b)的公式。
矩阵运算
Beta(0.25,0.5)
ans =
[ 5.24411510858474 ]
算式解析
5.24411510858474 /2
ans = 2.62205755429237
算式解析
功能:求Jacobi椭圆函数
格式:JacobiSn(u,k)
u:为任意的复数变量
k:必须是介于0与1之间的实数
说明:一般我们用Sn(u,k)来表示本函数.本函数相当于求第一类椭圆积分EllipticF函数的反函数.
JacobiSn(0.5,0.866025)
ans = 0.464426226873146
即sn(u=0.500000+0.000000i;k=0.866025+0.000000i)=0.466428+0.000000i
JacobiSn(0.5,0.866025)
ans = 0.464426226873146
JacobiSn(1+2i,0)
计算出现非数字的情况,请注意检查表达式是否出现除0的情形
JacobiSn(1+2i,0.5)
ans = 2.11350173673824 + 0.16995353310106i
【
//sn(u=0.500000+0.000000i;k=0.866025+0.000000i)=0.466428+0.000000i
//sn(u=1.000000+2.000000i;k=0.000000+0.000000i)=3.165779+1.959601i
】
功能:计算第一类完全椭圆积分(Complete Elliptic Integral)
格式:EllipticK(z)
说明:函数等价于Int(1/Sqrt(1-z^2*Sin(t)^2),0,pi/2),表示对1/sqrt(1-z^2*Sin(t)^2)函数中的变量t从0到pi/2进行定积分.
EllipticK(0.707)
ans = 1.85394676925858
即K(e=0.707)=1.853921
EllipticK(0.5)
ans = 1.6857503548126
即K‘(e=0.707)=K(e=0.5)=1.685750
K(e=0.707)=1.853921
K‘(e=0.707)=K(e=0.5)=1.685750
EllipticK(0.707)
ans = 1.85394676925858
EllipticK(0.5)
ans = 1.6857503548126
【
//K(k=0.707000+0.000000i)=1.853921+0.000000i
//K(k=0.500000+0.000000i)=1.685750+0.000000i
】
功能:计算第二类椭圆积分(Complete Elliptic Integral)
格式:EllipticE(z)、EllipticE(s,z)
说明:
1、第二类完全椭圆积分EllipticE(z)函数等价于Int(Sqrt(1-z^2*Sin(t)^2),0,pi/2),表示对Sqrt(1-z^2*Sin(t)^2)函数中的变量t从0到pi/2进行定积分.
2、第二类不完全椭圆积分函数EllipticE(s,z)=EllipticRF(c-1,c-z^2,c)-z^2/3*EllipticRD(c-1,c-z^2,c),其中c=1/sin(s)^2
EllipticE(0)
ans = 1.5707963267949
EllipticE(1)
ans = 0.785398163397448
EllipticE(0.707107)
ans = 1.3506437252615
【
椭圆周长积分表达式(第二类椭圆积分)
椭圆的周长是4aE(c/a),这里的函数E是第二类完全椭圆积分。
E(0)=pi/2(1/4圆弧弧长)
E(1)=1(1/4椭圆弧长的下确界)
E(sqrt(2)/2)=pi^(3/2)Γ(1/4)^(-2)+Γ(1/4)^2/(8sqrt(2))(b=c时的1/4椭圆弧长)
】
功能:Simpson积分
格式:IntegralSimpson(f,x,a,b,n);IntegralSimpson(f,x,a,b);IntegralSimpson(f,a,b)
说明:f为符号函数句柄,x为未知数名称,积分区间[a,b],n为复化积分时的等分数默认为500
f="log(1.0+x)/(1.0+x^2)"
f = "log(1.0+x)/(1.0+x^2)"
IntegralSimpson(f,x,0.0,1.0)
ans =
[ 0.27219826128798 ]
数学变换与滤波中只有
功能:一维傅里叶逼近(Fourier approximation)
格式:
fourapp(f,n,a,b,x)
fourapp(f,n,x)
fourapp(f,n)
功能:(离散)傅里叶变换
格式:Dft(a,n);Dft(a)
功能:(离散)逆傅里叶变换
格式:IDft(a,n);IDft(a)
功能:快速傅里叶变换
格式:FFt(a,n);FFT(a)
功能:快速傅里叶变换逆变换
格式:IFFt(a,n);IFFT(a)
kfour 傅里叶级数逼近
kkfft 快速傅里叶变换
kkfwt 快速沃什变换
kkspt 快速三次平滑
klman 离散随机系统的卡尔曼滤波
kkabg α-β-γ滤波
功能:对方阵进行LU分解.
格式:lu(a)//a为方阵变量
说明:函数自动生成名称为l的下三角矩阵,和名称为u的上三角矩阵,其中u的对角线全为1.
a=[1.0 2.0 -1.0
-2.0 -5.0 3.0
-1.0 -3.0 0]
a =
[ 1.00000000000000 2.00000000000000 -1.00000000000000
-2.00000000000000 -5.00000000000000 3.00000000000000
-1.00000000000000 -3.00000000000000 0.00000000000000 ]
lu(a)
l =
[ 1.00000000000000 0.00000000000000 0.00000000000000
-2.00000000000000 -1.00000000000000 0.00000000000000
-1.00000000000000 -1.00000000000000 -2.00000000000000 ]
u =
[ 1.00000000000000 2.00000000000000 -1.00000000000000
0.00000000000000 1.00000000000000 -1.00000000000000
0.00000000000000 0.00000000000000 1.00000000000000 ]
a=[7 8 9
14 46 51
28 82 163]
a =
[ 7.00000000000000 8.00000000000000 9.00000000000000
14.0000000000000 46.0000000000000 51.0000000000000
28.0000000000000 82.0000000000000 163.000000000000 ]
lu(a)
l =
[ 7.00000000000000 0.00000000000000 0.00000000000000
14.0000000000000 30.0000000000000 0.00000000000000
28.0000000000000 50.0000000000000 72.0000000000000 ]
u =
[ 1.00000000000000 1.14285714285714 1.28571428571429
0.00000000000000 1.00000000000000 1.10000000000000
0.00000000000000 0.00000000000000 1.00000000000000 ]
功能:求方阵行列式.此方法精度高,但运算的方阵的阶数最好不要超过5.
格式:Det(a)
说明:a为方阵
功能:采用LU分解算法求方阵行列式.适合阶数较大的矩阵.
格式:Det2(a)
说明:a为方阵
功能:采用QR分解算法求行列式,算出的结果可能正负号相反,本函数适合大阶数运算,但一般针对非奇异方阵.
格式:Det4(a)
说明:a为方阵
a=[1.0 2.0 -1.0
-2.0 -5.0 3.0
-1.0 -3.0 0]
a =
[ 1.00000000000000 2.00000000000000 -1.00000000000000
-2.00000000000000 -5.00000000000000 3.00000000000000
-1.00000000000000 -3.00000000000000 0.00000000000000 ]
b=Det(a)
b =
[ 2.00000000000000 ]
b=Det2(a)
b =
[ 2.00000000000000 ]
b=Det4(a)
b =
[ 2.00000000000000 ]
功能:矩阵相乘
格式:mul(a,b)
a=[1 0 0
-2 1 0
-1 1 1]
a =
[ 1.00000000000000 0.00000000000000 0.00000000000000
-2.00000000000000 1.00000000000000 0.00000000000000
-1.00000000000000 1.00000000000000 1.00000000000000 ]
b=[1 2 -1
0 -1 1
0 0 -2]
b =
[ 1.00000000000000 2.00000000000000 -1.00000000000000
0.00000000000000 -1.00000000000000 1.00000000000000
0.00000000000000 0.00000000000000 -2.00000000000000 ]
c=mul(a,b)
c =
[ 1.00000000000000 2.00000000000000 -1.00000000000000
-2.00000000000000 -5.00000000000000 3.00000000000000
-1.00000000000000 -3.00000000000000 0.00000000000000 ]
【
矩阵相乘等数值计算 2009-02-27 23:55
Now print resource matrix b[3][3]=
1 0 0
-2 1 0
-1 1 1
Now print resource matrix c[3][3]=
1 2 -1
0 -1 1
0 0 -2
Now printm multiply results matrix a[3][3]=B*C:
1 2 -1
-2 -5 3
-1 -3 0
】
a=[3 0
1 -1]
a =
[ 3.00000000000000 0.00000000000000
1.00000000000000 -1.00000000000000 ]
eig(a)
目前此函数只支持求方阵的特征值。
a=[-4.26923076923077 -4.57692307692308
5.19230769230769 6.26923076923077]
a =
[-4.26923076923077 -4.57692307692308
5.19230769230769 6.26923076923077 ]
eig(a)
目前此函数只支持求方阵的特征值。
【
原矩阵为{{3,0},{1,-1}},特征值为λ_1=3,λ_2=-1,特征向量为V_1={{4},{1}},V_2={{0},{1}} 。
原矩阵为{{-4.26923076923077,-4.57692307692308},{5.19230769230769,6.26923076923077}},特征值为λ_1=3,λ_2=-1,特征向量为V_1={{-3.26923076923077},{5.19230769230769}},V_2={{-7.26923076923077},{5.19230769230769}} 。
原矩阵为{{-3.92307692307692,-7.30769230769231},{2.76923076923077,5.92307692307692}},特征值为λ_1=2.99999999999999,λ_2=-.999999999999989,特征向量为V_1={{-2.92307692307693},{2.76923076923077}},V_2={{-6.92307692307691},{2.76923076923077}} 。
A(x,y)=(3x,x-y)的特征值为λ_1=3,λ_2=-1,在基(I_11=1,I_21=0),(I_12=0,I_22=1)下的矩阵为A。
A在基(E_11,E_21),(E_12,E_22)下的矩阵为E^(-1)AE={{-51/13,-95/13},{36/13,77/13}},其中E={{E_11,E_12},{E_21,E_22}}={{2,5},{5,6}}
A在基(H_11,H_21),(H_12,H_22)下的矩阵为H^(-1)AH={{17/3,20/3},{-8/3,-11/3}},其中H={{H_11,H_12},{H_21,H_22}}={{8,8},{4,7}}
从基E到基H的过渡矩阵E^(-1)H,其逆矩阵为H^(-1)E。
H^(-1)E(E^(-1)AE)E^(-1)H=H^(-1)AH
E^(-1)H={{-2.153846,-1},{2.4615,2}}={{-28/13,-1},{32/13,2}}
H^(-1)E={{-13/12,-13/24},{4/3,7/6}}
H^(-1)AH={{17/3,20/3},{-8/3,-11/3}}
原矩阵为{{5.66666666666667,6.66666666666667},{-2.66666666666667,-3.66666666666667}},特征值为λ_1=3,λ_2=-1,特征向量为V_1={{6.66666666666667},{-2.66666666666667}},V_2={{2.66666666666667},{-2.66666666666667}} 。
】
该软件目前还不支持求空间三点确定的三角形面积。
x=[1 2 3
2 5 3
6 1 8]
x =
[ 1.00000000000000 2.00000000000000 3.00000000000000
2.00000000000000 5.00000000000000 3.00000000000000
6.00000000000000 1.00000000000000 8.00000000000000 ]
PgArea(x)
PgArea函数接收的参数必须是行数为2的矩阵。
功能:求一元四次以内多项式的精确解
格式:Polyroot(f)
说明:f为符号句柄或者多项式的系数
f="x^3+x+1"
f=
"x^3+x+1"
polyroot(f)
方程:x^3+x^1+1=0 的根如下
x(1)= 0.34116390191401 - 1.16154139999725i
x(2)= 0.34116390191401 + 1.16154139999725i
x(3)= -0.682327803828019
ans =
[ 0.34116390191401 -1.1615413999972
0.34116390191401 1.16154139999725
-0.6823278038280 0.00000000000000 ]
chap2
1.空间平面对应于一个三元一次方程Ax+By+Cz+D=0。反之,任意一个三元一次方程也对应于空间中的一个平面。如果平面α的方程是Ax+By+Cz+D=0,其含义是平面α上任意动点(x,y,z)都是Ax+By+Cz+D=0的解。而Ax+By+Cz+D=0的每一组解也对应于α上某一点。按:2004.4.21求三点确定的平面的例子:①求解或求证:由A1(1,1,1),A2(1,1,-1),A3(1,-1,1)三点确定的平面α为x=1(z,y∈R)。解:设平面α:k1x+k2y+k3y=k,则线性方程组为:{{A1_x,A2_x,A3_x},{A1_y,A2_y,A3_y},{A1_z,A2_z,A3_z}}|{{k},{k},{k}},得到k2=k3=0,k1=k,即x=1。②求由B1(2,-1,1),B2(1,2,-1),B3(0,5,-1)三点确定的平面β。解1:~B1B2=(-1,3,-2),~B1B3=(-2,6,-2),~B2B3=(-1,3,0),B1与~B1B2、~B1B3的正交解空间为:取(A,B,C)∈{c(3,1,0)},任取(x,y,z)∈β,则3(x-2)+1(y+1)+0(z-1)=0,即平面β:3x+y=5(z∈R)。解2:设平面α:k1x+k2y+k3y=k,则线性方程组为:{{A1_x,A2_x,A3_x},{A1_y,A2_y,A3_y},{A1_z,A2_z,A3_z}}|{{k},{k},{k}},得到k1=6k/10,k2=2k/10,k3=0k/10,即由{A1_x,A1_y,A1_z},{A2_x,A2_y,A2_z},{A3_x,A3_y,A3_z}确定的平面为3x+y=5。注:由{A1_x,A2_x,A3_x},{A1_y,A2_y,A3_y},{A1_z,A2_z,A3_z}确定的平面为9x-8y+7z=10。 按:2004.4.14线性代数的欧氏几何意义的重新发现:三向量{A1_x,A1_y,A1_z},{A2_x,A2_y,A2_z},{A3_x,A3_y,A3_z}共面<=>|{{A1_x,A1_y,A1_z},{A2_x,A2_y,A2_z},{A3_x,A3_y,A3_z}}|=0<=>{A1_x,A1_y,A1_z},{A2_x,A2_y,A2_z},{A3_x,A3_y,A3_z}线性相关;二向量{A1_x,A1_y,A1_z},{A2_x,A2_y,A2_z}共线<=>|{{i,j,k},{A1_x,A1_y,A1_z},{A2_x,A2_y,A2_z}}|=0<=>b_i∝a_i,特别地,|{{i,j,k},{A1_x,A1_y,0},{A2_x,A2_y,0}}|=|{A1_x,A1_y},{A2_x,A2_y}}|·k=0<=>|{A1_x,A1_y},{A2_x,A2_y}}|=0。如,{3,1},{6,2}}、{{1,2},{2,4},{3,6}}均共线(平行),{{1,2},{2,4},{3,6}}不共线,{{1,2,1},{2,4,2},{3,6,4}}线性相关=>共面[按照这里的上下文,这里用矩阵表示几个向量,且用1个列向量表示1个向量];{{1,2,3},{2,4,6},{1,2,4}}线性相关=>共面[按照这里的上下文,这里用矩阵表示几个向量,且用1个行向量表示1个向量];({A1_x,A1_y,A1_z},{A2_x,A2_y,A2_z}}=0∩({A1_x,A1_y,A1_z},{A3_x,A3_y,A3_z}}=0=>{A2_x,A2_y,A2_z},{A3_x,A3_y,A3_z}共线。
2.欧氏几何公理的代数描述:
平面α:Ax+By+Cz+D=0上两点(x1,y1,z1),(x2,y2,z2)确定的直线为l:{(x,y(x),z(x))}
对于任意x∈l,Ax+By(x)+Cz(x)+D=Ax+D+[B(y2-y1)+C(z2-Z1)](x-x1)/(x2-x1)+By1+Cz1=Ax+D-A(x-x1)-Ax1-D=0,x∈α。
即公理1:如果一条直线上有两点在一个平面内,则该直线上所有点都在该平面内,也称直线在平面内。
公理2的解析描述:平面α:A1x+B1y+C1z+D1=0∩平面β:A2x+B2y+C2z+D2=0若有解则必有无穷解。
公理3的解析描述:当(x2-x1,y2-y1,z2-z1)与(x3-x2,y3-y2,z3-z2)线性无关即|{{i,j,k},{x2-x1,y2-y1,z2-z1},{x3-x2,y3-y2,z3-z2}}|≠0时,通过此三点的平面为…
3.R^3中曲面的切平面存在定理(2010.9.27)以及用二元实函显函数表示的曲面的切面计算公式(2004.5.13):设R^3中曲面Σ的方程为F(x,y,z)=0。若函数F(x,y,z)在点X_0(x_0,y_0,z_0)∈Σ处可微,且函数F(x,y,z)在点X_0处的各一阶偏导数不全为0,则曲面Σ在X_0有切平面存在,其方程为F‘_x(X_0)(x-x_0)+F‘_y(X_0)(y-y_0)+F‘_z(X_0)(z-z_0)=0。按:曲面z=f(x,y)在(x_0,y_0,f(x_0,y_0))处的切面为z=f‘_x(x_0,y_0)(x-x_0)+f‘_y(x_0,y_0)(y-y_0)+f(x_0,y_0)。例如,z=sqrt(1-x^2-y^2)在(0.5,0.5,sqrt(2)/2)处的切面为z=-(sqrt(2)/2)x-(sqrt(2)/2)y+sqrt(2)。
考虑Σ为平面的情形,R^3中的平面α:Ax+By+Cz+D=0在点X_0(x_0,y_0,z_0)∈α(<=>Ax_0+By_0+Cz_0+D=0)处存在切平面,且切平面为A(x_x_0)+B(y-y_0)+C(z-z_0)=Ax+By+Cz+D=0,即为平面α自身。
4.在切平面存在的情况下又可以根据如下定理来求曲面的法线方程和单位法向量m:
设R^3中曲面Σ的方程为F(x,y,z)=0。若函数F(x,y,z)在点X_0(x_0,y_0,z_0)∈Σ处可微,且函数F(x,y,z)在点X_0处的各一阶偏导数不全为0,则曲面Σ在X_0的法线方程为(x-x_0)/F‘_x(x_0,y_0,z_0)=(y-y_0)/F‘_y(x_0,y_0,z_0)=(z-z_0)/F‘_z(x_0,y_0,z_0),~n=±(δ(y,z)/δ(u,v),δ(z,x)/δ(u,v),δ(x,y)/δ(u,v))|X_0。
考虑Σ为平面的情形(Σ=α),R^3中的平面α:Ax+By+Cz+D=0在点X_0(x_0,y_0,z_0)∈α处的法线方程为(x-x_0)/A=(y-y_0)/B=(z-z_0)/C。
2011.5.20:取△X_3X_2X_1{<}α,利用三维叉积和克莱姆法则,则α的定向用它的法向量N=(N_x,N_y,N_z)=(X_2X_1×X_2X_3)=(X_1-X_2)×(X_3-X_2)=(y1z3+y2z1+y3z2-y1z2-y2z3-y3z1,x1z2+x2z3+x3z1-x1z3-x2z1-x3z2,x1y3+x2y1+x3y2-x1y2-x2y3-x3y1)=(X_2-X_1)×(X_2-X_3)=(△/D)(A,B,C)或法向量(A,B,C)或法向量(-A,-B-C)表示,其中N_x=y1z3+y2z1+y3z2-y1z2-y2z3-y3z1,N_y=x1z2+x2z3+x3z1-x1z3-x2z1-x3z2,N_z=x1y3+x2y1+x3y2-x1y2-x2y3-x3y1,△=|{{x1,y1,z1},{x2,y2,z2},{x3,y3,z3}}是AX_i+BY_i+CZ_i+D=0的系数行列式,A,B,C可以由x_i,y_i,z_i,D表示出来,A=△_A/△=(D/△)N_x,B=△_B/△=(D/△)N_y,C=△_C/△=(D/△)N_z。平面α的单位法向量即m=(A,B,C)/|(A,B,C)|。
若取法向量为N=(A,B,C),X_0∈α,则D=-N·X_0。则平面方程可以用向量的形式表示:N·X_0=-D。
如果Ax+By+Cz+D>0<=>N·X>-D,则点X=(x,y,z)在平面α的外侧(正面,N或m指向同一侧);如果Ax+By+Cz+D<0<=>N·X<-D,则点X=(x,y,z)在平面α的内侧(反面,与N或m的方向相反)。例如,对于数学中的右手系和平面α:F(x,y,z)=z=0,i,j∈α,m=k=i×j=(0,0,1),因m·(x,y,2)>-D=0,m·(x,y,-3)<-D=0,所以点X=(x,y,2)在平面α的外侧,X=(x,y,-3)在平面α的内侧。对于D3D中的左手系(i,j,-k),m=-k=-i×j=(0,0,1)(-k),结果不变。
又如,由切点X_0=(1/2,1/2,sqrt(2)/2)和切平面方程F(x,y,z)=(x-1/2)+(y-1/2)+sqrt(2)(z-sqrt(2)/2)=0<=>x+y+sqrt(2)z-2=0就可以求出法线方程x-1/2=y-1/2=(1/sqrt(2))(z-sqrt(2)/2),取单位主法向量m=(1/2,1/2,sqrt(2)/2)时就规定了一个定向。
5.面面角的计算:①η_1:9x+4y+7z=0与η_2:9x+8y+4z=0的面面角为<(9,4,7),(9,8,4)>=arccos(141/(sqrt(146)sqrt(161)))=0.403569281(合23.12281654°)。②面x+y-z=0与面z=0的面面角等于向量(1,1,-1)与向量(0,0,-1)夹arccos(1/(sqrt(3)-1))。
6.面面距的计算(4.23引理):平行平面η_1:k_1x+k_2y+k_3z=-D_1与η_2:k_1x+k_2y+k_3z=-D_2的面面距为d(η_1,η_2)=|D_2-D_1|/sqrt((k_1)^2+(k_2)^2+(k_3)^2)。
7.R^n(n=2,3)中其他几何量的计算(>=4.14):
长度|α-β|称为向量α和β的距离[其实就是欧氏空间R^n的弱抽象--线性度量空间R^n中的非齐次坐标表示的两个点的距离],记为d(α,β)。
点面距的计算:①点(-2,2,0)到平面18x+26y+11z-42=0的距离为26/sqrt(1121)。②已知截距为a,b,c,则平面:x/a+y/b+z/c=1(或k1x+k2y+k3z=k),原点到其距离d=|abc|/sqrt(a^2·b^2+a^2·c^2+b^2·c^2)(或d=k/sqrt(k1^2+k2^2+k3^2)) 。③已知x+2y+3z=12,求证x^2+2y^2+3z^2≥24(=|x=2,y=2,z=2)<=>……x+sqrt(2)y+sqrt(3)z=12……x^2+y^2+z^2≥24。利用点面距即可证得:原点到平面的距离为12/sqrt(1+2+3)=2sqrt(6)(=|(x,y,z)=(2,2sqrt(2),2sqrt(3)))。四月最值不等式:x+sqrt(e)y+sqrt(f)z=g=>x^2+y^2+z^2≥g^2/(1+e+f)(=|(x,y,z)=g(1,sqrt(e),sqrt(f))/(1+e+f))<=>x+ey+fz=g=>x^2+ey^2+fz^2≥g^2/(1+e+f)(=|(x,y,z)=g(1,1,1)/(1+e+f))。
四面体体积的计算:(1,1/2,1),(-1/3,1,2),(2/3,2,-2),(-2,2,0)四点确定的四面体体积为:(1/6)|{{1,1/2,1,1},{-1/3,1,2,1},{2/3,2,-2,1},{-2,2,0,1}}|=-13/18,(1/6)|{{-4/3,1/2,1},{-1/3,3/2,-3},{-3,3/2,-1}}|=13/18。
三角形面积的计算:(1,1/2,1),(-1/3,1,2),(2/3,2,-2)三点确定的三角形面积为:(1/2)‖{{e_1,e_2,e_3},{-4/3,1/2,1},{-1/3,3/2,-3}}‖=sqrt(1121)/12。
又如:A=(1,0,1),B=(1,2,-1),O=(0,0,0)确定的平面AOB为z=x-y,S_△AOB=(1/2)‖{{e_1,e_2,e_3},{1,0,1},{1,2,-1}}‖=(1/2)‖(-2,2,2)‖=sqrt(3)。
A=(1,0,1),B=(1,2,-1),O=(0,0,0),C=(-1,2,0)四点确定的四面体体积为:V_四面体=(1/3)S_△AOB*CH=(1/3)sqrt(3)*sqrt(3)=1,其中高CH=sqrt(3)。
A=(1,0,1),B=(1,2,-1),O=(0,0,0),C=(-1,2,0)四点确定的平行六面体体积为:V_平行六面体=(OA,OB,OC)=|A,B,C|=|{{1,1,-1},{0,2,2},{1,-1,0}}|=6。
‘定义向量u=(u_x,u_y,u_z)和向量v=(v_x,v_y,v_z)的叉积运算为:u×v=(u_yv_z-u_zv_y,u_zv_x-u_xv_z,u_xv_y-u_yv_x)
function cross(u1,u2,u3,v1,v2,v3)
cross1=u2*v3-u3v2
cross2=u3*v1-u1v3
cross3=u1*v2-u2v1
cross="(" & cross1 & "," & cross2 & "," & cross3 & ")"
end function
‘i×j = k,j×k = i,k×i = j
msgbox "i×j=" & cross(1,0,0,0,1,0)
msgbox "j×k=" & cross(0,1,0,0,0,1)
msgbox "k×i=" & cross(0,0,1,1,0,0)
function Arccos(X)
Arccos=Atn(-X/Sqr(-X*X+1))+2*Atn(1)
end function
‘向量u=(u_x,u_y,u_z)和向量v=(v_x,v_y,v_z)的夹角θ=arccos[(u,v)/(‖u‖·‖v‖)],0<=θ<=pi,
function angle(u1,u2,u3,v1,v2,v3)
X=(u1*v1+u2*v2+u3*v3)/(sqr(u1*u1+u2*u2+u3*u3)*sqr(v1*v1+v2*v2+v3*v3))
angle=Arccos(X)
end function
msgbox angle(1,1,-1,0,0,-1)
msgbox Arccos(sqr(3)/3)
chap3
2014-6-21
上界O——大O记法
下界Ω——大Ω记法
在讨论排序时,不好的排序算法是O(N^2),或称为二次的。
第7章 排序
我们对内部排序的考查将指出:
存在几种容易的算法以O(N^2)排序,如插入排序。
有一种算法叫希尔排序,它编程简单,以o(N^2)(小o记法)运行。
还有一些稍微复杂的O(NlogN)的排序算法。
任何通用的排序算法均需要Ω(NlogN)次比较。
排序还是一种能够对其进行精确的算法的范例。
基于比较的排序:<和>操作符、赋值运算。
在STL中,排序是通过使用函数模板sort来完成的。
sort的参数反映了一个容器(的范围)的头尾标志,以及一个可选的比较器。
迭代器必须只是随机访问。sort算法不能保证相等的项保持它们原始的次序(如果这很重要的话,可以使用stable_sort来代替sort)。
sort使用例子:
非降序排列
非升序排列
前半部分按非降序排列
插入排序为O(N^2),平均情形也是Θ(N^2)(大Θ记法)。
定理7.1:N个互异元素的数组的平均逆序数是N(N-1)/4。
定理7.2:通过交换相邻元素进行排序的任何算法平均需要Ω(N^2)时间。
快速排序的平均运行时间是O(NlogN),它的最坏情形的性能为O(N^2)。
原文:https://www.cnblogs.com/Ivanhan2019/p/12394293.html