“MATLAB程序设计(王赫然)”阅读笔记(二)——数学计算

2 篇文章 0 订阅
2 篇文章 0 订阅

代码下载

1.初等数学

1.1离散数学:

%分解质因数
primeFactor = factor(20)
%最大公约数
greatestCommonDivisor = gcd(20,15)
%最小公倍数
leastCommonMultiple = lcm(20,15)
%确定哪些数组元素为质数
isprime = isprime([2 3 0 6 10])
%小于等于输入值的质数
PrimeNumbers = primes(20)
%所有可能的排列
permulations = perms([1 2 3])
%阶乘
inputFactorial = factorial(5)
%有理分式近似值
rationalFraction = rat(pi,1e-7)

1.2多项式

%创建上述多项式
p = [1 -10 35 -50 24]
%计算x=2时多项式的值
polyValue = polyval(p,2)
%同时计算x为15的值
polyValue2 = polyval(p,1:5)
%多项式作图
x = 0.5:0.1:4.5;
plot(x,polyval(p,x));yline(0);
%求多项式的根
r = roots(p)
%由根反求多项式
pCalc = poly(r)
%显示多项式,poly2sym本质就是将多项式向量转换为符号矩阵
poly2sym(p)

2.线性代数

关于矩阵的基本运算,对于符号阵和数值阵都是通用的

syms a b c d
x = [a b;c d]
diagX = diag(x)
diagMatrixX = diag(diag(x))
traceX = trace(x)
rankX = rank(x)
detX = det(x)
syms a b c
x = [a b;c 0]
y = [1 2;3 0]
% 三角分解
% A=LU
% A=P'LU
[Lx,Ux] = lu(x)
[Lu,Uy] = lu(y)
[Ly,Uy,Py] = lu(y)
% 特征分解 A=VDV-1
[Vx,Dx] = eig(x)
[Vy,Dy] = eig(y)

3.微积分

1.极限

syms x a
f = (1+a/x)^x;
limF1 = limit(f,x,1)
limF2 = limit(f,x,0,'right')
limF3 = limit(f,x,-inf)
% 作a=1时的图像
fplot(@(x)(1+1/x)^x,[-50 50]);
yline(exp(1));%渐近线

对多元函数求极限,仍然是用limit()函数,

limit(limit(f,x,x0),y,y0)
%等价于
limit(limit(f,y,y0),x,x0)

2.导数
用diff函数,diff(f,x)表示fx求导,diff(f,x,2)表示f对x求二阶导
3.积分

syms x a 
f = a*x^2
intf1 = int(f,x)
intf2 = int(int(f,x),x)
intf3 = int(f,x,0,1)

int对于不定积分与定积分通用,多次积分需要嵌套实现,不定积分结果省略了C。
4.泰勒展开

syms x
f = sin(x)
f1 = taylor(f,x,0,'order',3)
f2 = taylor(f,x,0) % 等效于6% 作图
fplot(f,'LineWidth',2); hold on;
fplot(f1);
fplot(f2);

5.傅里叶展开

syms x
f = abs(x)/x
p = 10;
L = pi;
fs = int(f,x,-L,L)/2/L;
for n=1:p
    a = int(f*cos(n*pi*x/L),x,-L,L)/L;
    b = int(f*sin(n*pi*x/L),x,-L,L)/L;
    fs = fs+a*cos(n*pi*x/L)+b*sin(n*pi*x/L);
end
fs %显示傅里叶展开结果
fplot(f);hold on;
fplot(fs);

4.插值与拟合

1.一维插值

x = 0:pi/4:2*pi;
v = sin(x);
xq = 0:pi/16:2*pi;
ax(1) = subplot(121);
vq1 = interp1(x,v,xq);
plot(x,v,'o',xq,vq1,':.');
title('(Default) Linear Interpolation');
% 三次样条插值
ax(2) = subplot(122);
vq2 = interp1(x,v,xq,'spline');
plot(x,v,'o',xq,vq2,':.');
title('Spline Interpolation');
axis(ax,"square")

2.二维网格数据插值
调用格式:interp2(x0,y0,z0,x1,y1,'method')

[X,Y] = meshgrid(-3:3);
V = peaks(X,Y);
subplot(2,2,1);
surf(X,Y,V)
title('Original Sampling');
[Xq,Yq] = meshgrid(-3:0.2:3);
%
Vq = interp2(X,Y,V,Xq,Yq);
subplot(2,2,2);
surf(Xq,Yq,Vq);
title('Linear');
%
Vq = interp2(X,Y,V,Xq,Yq,'cubic');
subplot(2,2,3);
surf(Xq,Yq,Vq);
title('Cubic');
%
Vq = interp2(X,Y,V,Xq,Yq,'spline');
subplot(2,2,4);
surf(Xq,Yq,Vq);
title('Spline');

对于非网格数据,MATLAB提供了一个面向更为一般数据的插值函数griddata()函数:
griddata(x0,y0,z0,x,y,'method')

x = -3+6*rand(30,1);
y = -3+6*rand(30,1);
v = sin(x).^4.*cos(y);%构造已知数据
[xq,yq] = meshgrid(-3:0.1:3);%构造插值网
subplot(2,2,1);
z1 = griddata(x,y,v,xq,yq,'nearest');
plot3(x,y,v,'o');hold on
mesh(xq,yq,z1)
title('Nearest Neighbor')
subplot(2,2,2);
z2 = griddata(x,y,v,xq,yq,'linear');
plot3(x,y,v,'o');mesh(xq,yq,z2)
title('Linear')
subplot(2,2,3);
z3 = griddata(x,y,v,xq,yq,'natural');
plot3(x,y,v,'o');mesh(xq,yq,z3)
title('Natural Neighbor')
subplot(2,2,4);
z4 = griddata(x,y,v,xq,yq,'cubic');
plot3(x,y,v,'o');mesh(xq,yq,z4)
title('Cubic')

3.多项式拟合
拟合行为需要样本点数据作为输入

% 准备样本数据并作图
x = linspace(0,1,5);
y = 1./(1+x);
plot(x,y,'o');hold on
fplot(@(x) 1./(1+x),[-0.5 2],'--')
p = polyfit(x,y,4)
fitFunc = vpa(poly2sym(p),3)%显示便于观看的多项式
fplot(poly2sym(p),[-0.5 2])
legend('Sample','Origin','Fit')

5.代数方程与优化

1.代数方程

syms x
eqn = x^2+x-1 % 方程定义
solveSym1 = solve(eqn,x) %解析解
solveNum1 = vpasolve(eqn) %数值解

2.无约束优化
注意设置函数时,要将多元自变量写为x(1)、x(2)的形式。
优化工具箱提供的fminunc()优化速度更快。
求最大值只需要前面乘以一个负号。

[x,y] = meshgrid(-2:0.1:2,0:0.1:3);
z = 100*(y-x.^2).^2+(1-x).^2;
surf(x,y,z);
shading interp;
fun = @(x) 100*(x(2)-x(1)^2)^2+(1-x(1))^2;
x0 = [-1.2,1];
options = optimset('Plotfcns',@optimplotfval);
x1 = fminsearch(fun,x0,options)
x2 = fminunc(fun,x0,options)

3.线性规划
min ⁡ f T x  s.  t . { A x ⩽ b A e q x = b e q l b ⩽ x ⩽ u b \min \boldsymbol{f}^{\mathrm{T}} \boldsymbol{x} \quad \text { s. } \mathrm{t.}\left\{\begin{array}{l} \boldsymbol{A} \boldsymbol{x} \leqslant \boldsymbol{b} \\ \boldsymbol{A}_{\mathrm{eq}} \boldsymbol{x}=\boldsymbol{b}_{\mathrm{eq}} \\ \boldsymbol{l b} \leqslant \boldsymbol{x} \leqslant \boldsymbol{u} \boldsymbol{b} \end{array}\right. minfTx s. t.AxbAeqx=beqlbxub
f ( x ) = − 2 x 1 − x 2  其中:  2 x 2 ⩽ 7 ; x 1 + 4 x 2 ⩽ 9 ; x 1 ⩽ 4 ; x 2 ⩽ 8  求:  min ⁡ f ( x ) \begin{array}{l} f(x)=-2 x_{1}-x_{2} \text { 其中: } 2 x_{2} \leqslant 7 ; x_{1}+4 x_{2} \leqslant 9 ; x_{1} \leqslant 4 ; x_{2} \leqslant 8 \\ \text { 求: } \min f(x) \end{array} f(x)=2x1x2 其中2x27;x1+4x29;x14;x28 minf(x)

f = [-2 -1]';% 函数定义
A = [0 2;1 4];b = [7;9];
Aeq = []; beq = [];
lb = []; ub = [4;8];
[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub)

4.非线性规划
min ⁡ f ( x )  s.t.  { A x ⩽ b A e q x = b e q l b ⩽ x ⩽ u b C ( x ) ⩽ 0 C e q ( x ) = 0 \min f(\boldsymbol{x}) \text { s.t. }\left\{\begin{array}{l} \boldsymbol{A} \boldsymbol{x} \leqslant \boldsymbol{b} \\ \boldsymbol{A}_{\mathrm{eq}} \boldsymbol{x}=\boldsymbol{b}_{\mathrm{eq}} \\ \boldsymbol{l} \boldsymbol{b} \leqslant \boldsymbol{x} \leqslant \boldsymbol{u} b \\ \boldsymbol{C}(\boldsymbol{x}) \leqslant 0 \\ \boldsymbol{C}_{\mathrm{eq}}(\boldsymbol{x})=0 \end{array}\right. minf(x) s.t. AxbAeqx=beqlbxubC(x)0Ceq(x)=0
一般用边界约束优化函数fmincon来解决。
f ( x ) = − x 1 x 2 x 3  其中:  0 ⩽ x 1 + 2 x 2 + 4 x 3 ⩽ 12  求  min ⁡ f ( x ) f(x)=-x_{1} x_{2} x_{3} \text { 其中: } 0 \leqslant x_{1}+2 x_{2}+4 x_{3} \leqslant 12 \text { 求 } \min f(x) f(x)=x1x2x3 其中0x1+2x2+4x312  minf(x)

func = @(x) -x(1)*x(2)*x(3);
x0 = [1;1;1];% 起始值
A = [-1 -2 -4;1 2 4];
b = [0;12];
[x1,va11] = fmincon(func,x0,A,b)

5.最大值最小化问题
[x,fval]=fminimax(fun,x0,A,b,Aeq,beq,lb,ub)格式的函数。

6.微分方程

1.常微分方程(ODE)解析解
无初始条件微分方程

syms a t y(t) z(t)
eqn = diff(y,t,2) == a*y %符号方程
ySol(t) = dsolve(eqn)

有初始条件的微分方程

syms a t y(t) z(t)
eqn = diff(y,t) == a*y
cond = y(0) == 5;
ySol(t) = dsolve(eqn,cond)

微分方程组

syms a t y(t) z(t)
eqns = [diff(y,t)==z,diff(z,t)==-y]
sol = dsolve(eqns);
solY = sol.y,solZ = sol.z

2.常微分方程数值解
用ode45()函数
3.微分方程Simulink求解
4.偏微分方程工具箱PDE
pdetool命令打开PDE工具箱。

7.概率统计

1.概率分布,连续随机变量的概率分布函数F(x),又叫累计分布函数,即CDF,概率密度函数,简称PDF。
用法:

x = 0:20; lamda = 10;
pdf_P = pdf('Poisson',x,lamda);
cdf_P = cdf('Poisson',x,lamda);
ax(1) = subplot(2,2,1);stem(x,pdf_P),line(x,pdf_P);
%离散点用stem画针状图,连续点用plot画连续图
title('Poisson PDF');
ax(2) = subplot(2,2,2);plot(x,cdf_P);
title('Poisson CDF');

工具箱:命令行输入:disttool

2.伪随机数
产生均匀分布随机数的rand()
产生均匀分布随机整数的randi()
产生标准正太分布随机数的randn()
统计和机器学习工具箱SMLT中还提供了更为通用和强大的随机数产生函数random(),代码形式:R=random('name',A,B,C,D,[size])
3.统计量分析
mean()均值函数、var()方差函数、std()标准差函数、moment()中心矩函数
以上函数的输入参数不仅可以是向量,还可以是矩阵,相当于对矩阵中所有列进行计算,因而输出的是一个行向量,如果需要对矩阵中所有元素进行计算,则可以采用mean(x(:))

x = random('Normal',2,4,[1e4,1]);
meanX = mean(x) %均值
s2X = var(x) %方差
sX = std(x) %标准差
% 构造概率分布对象
pd = makedist('Normal','mu',2,'sigma',4);
meanX2 = pd.mean %均值
meanX2_mu = pd.mu %均值
s2X2 = pd.var %方差
s2X2 = pd.std %标准差
sX2_sigma = pd.sigma %标准差
A1 = sum(x.^1)/length(x) %一阶原点矩
A2 = sum(x.^2)/length(x) %二阶原点矩
B1 = moment(x,1) %一阶中心距
B2 = moment(x,2) %二阶中心矩

4.参数估计
通用参数估计函数pd=fitdist(x,distname)
distributionFitter——参数估计器APP
5.假设检验
对于疑似符合正态分布的数据,当已知标准差时,可以采用Z检验,函数为ztest(),若不已知标准差时,可以使用T检验。h为检验结论,为0时表示不拒绝假设,也就是接受假设;p为该检验的显著性水平;ci为置信区间。

x = random('Normal',2,4,[1e4,1]);
sX = std(x);
%Z检验—已知标准差
[hZ,pZ,ciZ,~] = ztest(x,2,sX)
%T检验—不知标准差
[hT,pT,ciT,~] = ttest(x,2)

.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值