【2013-10-3前】Matlab笔记1
来源:互联网 发布:资金博弈指标源码 编辑:程序博客网 时间:2024/06/05 17:55
前言
之前发过一篇文章BMP格式,主要是为了说明,在你用第三方软件,或API对图片进行操作时,其实首先要对图片的文件头进行解析,只是第三方软件或API已经帮你处理好了,你只需要关注图像处理的算法本身就行了!
Matlab是个不错的工具,可以快速有效的测试算法,但其本身只是个工具,真正重要的还是算法。本文主要是对参考文献做的笔记,方便自己查看。
第一部分 基础篇:
第一章:数据类型
double:a=3+2.3i
ceil--向正无穷取整、fix--向零取整、floor--向负无穷取整、round--四舍五入
第二章:向量和矩阵运算
第三章:表达式
第四章:交互及文件操作
第二部分 科学计算:
第五章:线性方程组
函数名说明函数名说明chol矩阵的cholesky分解lu矩阵的LU分解cholinc矩阵的不完全cholesky分解luinc矩阵的不完全LU分解diag提取矩阵对角元素norm矩阵或矢量的范数eig求本征值和本征向量normest求矩阵的最大范数矢量eye生成单位矩阵pinv求伪逆矩阵fliplr左右翻转矩阵qrQR分解flipud上下翻转矩阵rank求矩阵的秩inv求逆矩阵trace矩阵对角元素的和(迹)线性方程组wiki
ex1:AX=B,A和B有相同的行数,则解为X=A\B;X=X';
ex2:消元法--rref(A)--rref可以得到矩阵的最简阶梯矩阵;列主元Gauss消去法解方程组A=[4,2,-6,4;3,1,5,2;2,3,2,-1;2,4,1,2];B=[2;0;0;8];X=CMGelim(A,B);
function X = CMGelim(A,B)% 列主元Gauss消元法% A是方矩阵% b是列向量% X是线性方程组AX=B的解。if size(A,1)~=size(A,2); % 判断A是否为方矩阵 error('Matrix U must be square.');endN = size(A,1); % 返回未知数个数Ap = [A,B]; % 生成增广矩阵for n = 1:N-1; [Y,Ind] = max(abs(Ap(n:N,n))); % 找出列主元的位置Ind C = Ap(n,:); % 交换当前行和列主元对应的行 Ap(n,:) = Ap(Ind+n-1,:); % 交换当前行和列主元对应的行 Ap(Ind+n-1,:) = C; % 交换当前行和列主元对应的行 if Ap(n,n)==0; % 判断矩阵A是否奇异 error('Matrix is close to singular'); end for k = n+1:N; sc=Ap(k,n)/Ap(n,n); % 消元系数 Ap(k,n:N+1)=Ap(k,n:N+1)-sc*Ap(n,n:N+1); % 消元 endendX=uelim(Ap(:,1:N),Ap(:,N+1)); % 调用程序uelim.m进行回代过程
ex3:LU分解-A=[3,2,2,5;2,2,3,5;2,3,4,2;2,-3,3,2];B=[2;0;0;9];[L,U]=lu(A);B1=L\B;X=uelim(U,B1);Delta=[A*X'-B]';
function X = uelim(U,B);% U是上三角方矩阵。% b是列向量。% X是方程组AX=b的解。if prod(diag(U))==0; % 判断矩阵U是否奇异 error('Matrix is close to singular or badly scaled.');endif size(U,1)~=size(U,2); % 判断U是否为方矩阵 error('Matrix U must be square.')endD = triu(U)-U;if sum(abs(D(:)))>eps; % 判断U是否为上三角矩阵 error('Matrix U must be upper triangular.')endn = length(B); % 返回未知数个数X(n) = B(n)/U(n,n); % 获得最后一个未知数的值for k = n-1:-1:1; X(k) = (B(k)-sum(X(k+1:n).*U(k,k+1:n)))/U(k,k); % 依次求解其它未知数end
ex4:迭代法:1、雅可比迭代法:A=[9,4,2;3,8,2;2,3,7];B=[1,2,3];X0=[0,0,0];Y=Jacobi_iteration(A,B,X0);
function X = Jacobi_iteration(A,B,X0,kmax,tol);% 雅可比(Jacobi)迭代法解线性方程组AX=Bif nargin == 4; tol = 1e-6; % 设置默认精度elseif nargin ==3; tol = 1e-6; kmax = 500;% 设置默认迭代次数elseif nargin == 2; tol = 1e-6; kmax = 500; X0 = zeros(size(B)); % 设置默认初值end n = length(B); % 获得未知数个数if size(X0,1)<size(X0,2); % 把默认初值改为列向量 X0 = X0';endDA = diag(A); %提取A的对角元素Ap = [diag(DA)-A]./repmat(DA,1,n); % 生成式(7-28)中的矩阵ApBp = B./DA; % 生成式(7-28)中的向量Bpfor k = 1:kmax X = Ap*X0+Bp; % 雅可比(Jacobi)迭代公式 if norm(X-X0)/(norm(X0)+eps)<tol;% 达到精度将终止循环 break; end X0 = X;endX=X';
2、高斯-赛德尔迭代1法:A=[9,2,2-4;2,8,2,-3;2,2,7,2;3,2,-2,9];B=[1;-1;2;1];X0=[0,0,0,];X=gauseid(A,B,X0);
function X = gauseid(A,B,X0,kmax,tol);%This function is to find x = A^(-1)*B by Gauss–Seidel iteration.% A是系数矩阵% B是列向量% X0是迭代初值% kmax是最大迭代次数% tol是预定的精度if nargin == 4; tol = 1e-6; % 设置默认精度elseif nargin ==3; tol = 1e-6; kmax = 500;elseif nargin == 2; tol = 1e-6; kmax = 500; X0 = zeros(size(B));end n = length(B); % 获得未知数个数if size(X0,1)<size(X0,2); X0 = X0';endX = X0;for k = 1: kmax X(1) = (B(1)-A(1,2:n)*X(2:n))/A(1,1); for m = 2:n-1; tmp = B(m)-A(m,1:m-1)*X(1:m-1)-A(m,m+1:n)*X(m+1:n); X(m) = tmp/A(m,m); %Eq.(2.5.4) end X(n) = (B(n)-A(n,1:n-1)*X(1:n-1))/A(n,n); if nargout == 0, % 无输出时显示过程结果 X, end if norm(X - X0)/(norm(X0) + eps)<tol;% 达到精度将终止循环 break; end X0 = X;endX = X';
ex5:共轭梯度法,bicg共个梯度、bicgstab稳定双共轭梯度、cgs复共轭梯度平方、gmres广义极小残差、lsqr共轭梯度的LSQR、minres最小残差、pcg预处理共轭梯度、qmr准最小残差、symmlq对称LQ
第六章:超越方程求解
函数解法:
ex1: solve求解
f = sym('a*x^2+b*x+c=0');% f = 'a*x^2+b*x+c=0';x = solve(f)pretty(x)xL = latex(x) x = -(b + (b^2 - 4*a*c)^(1/2))/(2*a) -(b - (b^2 - 4*a*c)^(1/2))/(2*a)ex2:分别求解和其中a为未知数;将p,x和b作为常数看待
E1 = 'exp(-p*x)+b*sin(a)'; % 定义方程E2 = '3*a+4*cos(a+pi)=0'; % 定义方程a1 = solve(E1,'a') % 求解方程,并指定a为未知数 a2 = solve(E2,'a') % 求解方程,并指定a为未知数a2d = double(a2) % 转化为双精度数据
ex3:求非线性4元方程组的解
分析:第一个方程是线性的,而其他3个是非线性的
E1 = 'a+b+x=y*3'; % 定义方程E2 = 'a*x-b*y=1'; % 定义方程E3 = 'a*b+x*y=2'; % 定义方程E4 = 'a+b=(x+y)^2'; % 定义方程[a,b,x,y]=solve(E1,E2,E3,E4); % 解方程组Solution = [a, b, x, y] % 合为一个矩阵ex4:求非线性方程组的解
syms x y; % 定义符号变量E1 = 'x*y=1'; % 定义方程E2 = 'x^y=4'; % 定义方程J = solve(E1,E2,x,y); % 求解方程,J是结构体x=J.x % 显示xy=J.y % 显示yxd=double(x)yd=[y]figure;x = linspace(-2,8,200);y = lambertw(x);plot(x,real(y),'k',x,imag(y),'k:');set(gca,'Fontsize',12);xlabel('\itx','Fontname','Times','Fontsize',18);ylabel('lambertw({\itx})','Fontname','Times','Fontsize',18);set(gca,'Position',[0.13 0.31 0.775 0.615]);legend('Re','Im',0);set(gcf,'Color','w');ex5:求y=0,x的解
syms x a b; % 定义符号变量fx = x.^2-a*sin(x)+b; % 定义符号函数fx = subs(fx,{a,b},{1,-2}); % 对a和b赋值fx = char(fx); % 把fx转换为字符串fx = strrep(fx,'^','.^'); % 把乘方运算转换为点运算fx = inline(fx); % 定义内联函数x1 = fzero(fx,0) % 求函数第1的零点x2 = fzero(fx,2) % 求函数第2的零点xt = -6:.1:6; % 产生[-6, 6]区间内等间距采样点plot(xt,fx(xt)); % 绘制fx的曲线图hold on;plot(xlim,[0,0],'k:') % 绘制0刻度线set(gca,'Position',[0.13 0.31 0.775 0.615]);set(gcf,'color','w');
ex6:求函数在【1,2】区间内的零点
xx = linspace(1,4,200);yy = [xx.^2-4*sin(5*xx)]./[xx.^2+cos(xx)];plot(xx,yy,'k');fun = inline('abs([x^2-4*sin(5*x)]/[x^2+cos(x)])'); % % 转化为函数f(x)的绝对值x01 = fminbnd(fun,1,1.5) % 计算最小值x02 = fminbnd(fun,1.5,2) % 计算最小值x03 = fminbnd(fun,1,4)[x03, fval] = fminbnd(fun,1,4) % 计算最小值hold onplot(xx,abs(yy),'k:');L=legend('{\itf}({\itx})','|{\itf}({\itx})|',0);set(L,'Fontsize',18);plot(x01,0,'r*','markersize',14); % 把解画到图上plot(x02,0,'r*','markersize',14); % 把解画到图上plot(x03,fval,'ro','markersize',14); % 把解画到图上plot(x03,0,'ro','markersize',14);set(gca,'Fontsize',18);set(gcf,'Color','w');ex7:二分法,求解两个方程在区间【1,4】内的解,
其中,初始条件为
xx = linspace(1,4,200); % 对自变量采样for k=1:length(xx); x=xx(k); Ix=quad('sqrt(t).*sin(t).*exp(-t)',0,sin(6*x)); % 计算离散积分 y(k)=-2+x+Ix^2; % 得到方程1中函数的数值endsubplot(121);plot(xx,y); % 绘制曲线hold on;plot(xlim,[0,0],'r:') % 绘制0刻度线[x01, f1] = dichotomy('fund1',1,4) % 解方程1plot(x01,f1,'k*','markersize',12) % 用符号"*"标出方程1的解set(gca,'Position',[0.13 0.41 0.327023 0.515]); % 重置坐标轴位置set(gca,'Fontsize',12); % 重置字体大小subplot(122);[t,y]=ode45(@vdp1,[0 4],[2 0]); % 得到方程2中函数的数值plot(t,y(:,1)); % 绘制曲线hold on;plot(xlim,[0,0],'r:') % 绘制0刻度线[x02, f2] = dichotomy('fund2',1,4) % 解方程2plot(x02,f2,'k*','markersize',12) % 用符号"*"标出方程2的解set(gca,'Position',[0.577977 0.41 0.327023 0.515]); % 重置坐标轴位置set(gca,'Fontsize',12); % 重置字体大小set(gcf,'Color','w'); % 重置图形背景色ex8:抛物线法,求解方程在区间【1,3】内的解
xx = linspace(1,3,200); % 对自变量采样y = fund3(xx); % 计算个点的函数值plot(xx,y); % 绘制函数f(x)曲线hold on;plot(xlim,[0,0],'r:'); % 绘制零刻度线xr = parabola('fund3',1,2,3) % 抛物线法解方程plot(xr,fund3(xr),'k*','markersize',12); % 绘制解对应的点set(gca,'Fontsize',12)set(gcf,'Color','w');ex9:牛顿法,求解方程在区间【3,5】内的解
xx = linspace(0,6,200); % 对自变量采样y = fund4(xx); % 计算个点的函数值plot(xx,y); % 绘制函数f(x)曲线hold on;plot(xlim,[0,0],'r:'); % 绘制零刻度线xr1 = Newtonm('fund4',1.5) %牛顿法求根,初始点是1.5plot(xr1,fund4(xr1),'ks','markersize',12); % 绘制解对应的点plot(1.5,fund4(1.5),'ks','markersize',12); % 绘制解对应的点xr2 = Newtonm('fund4',3.5) %牛顿法求根,初始点是3.5plot(xr2,fund4(xr2),'k*','markersize',12); % 绘制解对应的点plot(3.5,fund4(3.5),'k*','markersize',12); % 绘制解对应的点xr3 = Newtonm('fund4',5.5) %牛顿法求根,初始点是5.5plot(xr3,fund4(xr3),'ko','markersize',12); % 绘制解对应的点plot(5.5,fund4(5.5),'ko','markersize',12); % 绘制解对应的点set(gca,'Fontsize',12)set(gcf,'Color','w');ex10:正割法,求解方程
fun = inline('exp(x)-x-5'); % 定义方程中的函数f(x)x0 = 3.5; % 第一初始值x1 = 3; % 第二初始值 xr = secant(fun,x0,x1) % 用正割法解方程xs = secant(fun,x1,x0) % 用正割法解方程xq = fzero(fun,2) % 利用fzero函数作比较x0 = 1; % 第一初始值x1 = 3; % 第二初始值 xw = secant(fun,x0,x1) % 用正割法解方程xa = steffenson(fun,x1) % 用steffenson法解方程x0 = 1:.4:3.5;for k = 1:length(x0); % 测试不同初始值对求解的影响 xt = x0(k); xa = steffenson(fun,xt); T(k,:)=[xt,xa];endT
第七章:数据拟合与插值
ex1:线性拟合
xk = 0:9;
yk = [2 3.4 5.6 8 11 12.3 13.8 16 18.8 19.9];xk = 0:9;yk = [2 3.4 5.6 8 11 12.3 13.8 16 18.8 19.9];plot(xk,yk,'r+')h=lslinexd = get(h, 'XData');yd = get(h, 'YData');a = [yd(1)-yd(2)]/[xd(1)-xd(2)]b = yd(1)-a*xd(1)set(gcf,'Color','w')set(gca,'Fontsize',16)P = polyfit(xk,yk,1)ex2:二元线性拟合
x =0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000
y = 1.8000 1.7000 1.6000 1.5000 1.4000 1.2000 1.0000 0.8500 0.6700
z =5.1000 5.4000 5.7000 6.0000 6.3000 6.4000 6.5000 6.7000 6.8000
M=[x',y',ones(9,1)];d=z;[X, resnorm, residual] = lsqlin(M,d)X=X', resnorm, residual=residual'ex3:多项式拟合
利用从2到5次多项式分别显示多项式系数和次数
x = 0:5; % 输入拟合x数据y = [1 22 61 69 76 111]; % 输入拟合y数据xp = 0:0.02:5; % 产生更密集的x轴数据for N=2:5P = polyfit(x,y,N); % N次多项式拟合yp = polyval(P,xp); % 计算xp出的多项式值plot(x,y,'r+',xp,yp,'k'); % 绘制数据点与拟合曲线title(['n=',int2str(N)],'Fontsize',16); % 显示次数 for k=1:length(P); text(1+k*0.4,k*10,['P(',num2str(k),... ')=',char(vpa(P(k),4))],... 'FOntsize',16); %显示所有多项式系数 end set(gca,'Fontsize',14); %设置字体大小 set(gcf,'Color','w'); % 重置背景色pause % 停顿endex4:非线性数据拟合
xd =1 2 3 4 5 6 7 8 9 10
yd =3.5000 3.0000 2.6000 2.3000 2.1000 1.9000 1.7000 1.6000 1.50001.4000
load P0528 % 读入数据c0 = [0,1,1]; % 初始值c = lsqcurvefit('fit_model_a',c0,xd,yd) % 进行非线性拟合plot(xd,yd,'r+','Markersize',10); % 利用原始数据绘图hold on;xp = linspace(min(xd),max(xd),200); % 生成原始数据范围内的等间距采样点yp = fit_model_a(c,xp); % 利用拟合系数计算因变量数值plot(xp,yp); % 绘制拟合曲线set(gcf,'Color','w');set(gca,'Fontsize',16);c0 = [0,1,1]; % 初始值c = lsqnonlin('fit_model_b',c0) % 进行非线性拟合
ex5:拉格朗日插值
function y=lag_interp(x,xd,yd);%Example: % x=1:.1:4; % 待求点数据% xd=1:4; % 插值点自变量数据% yd=[2,1,3,4]; % 插值点因变量数据% y=lag_interp(x,xd,yd); % 计算拉格朗日插值% plot(x,y,'k',xd,yd,'ko','markersize',10);%绘制曲线N = length(xd); % 插值点自变量数据长度L = length(x); % 待求点数据长度W = repmat(xd',1,L); % 生成矩阵WX = repmat(x,N,1)-repmat(xd',1,L); % 矩阵Xty = 0; % 初始化yfor k = 1:N; Xk = X; Xk(k,:) = yd(k)*ones(1,L); % 生成矩阵Xk Wk = xd(k)-W; Wk(k,:) = 1;% 生成矩阵Wk y = y+prod(Xk./Wk); % 累积求和endex6:Hermite插值
x=1:.1:4; % 待求点数据xd=1:4; % 插值点自变量数据yd=[2,1,3,4]; % 插值点因变量数据rand('state',0); % 设置随机数状态dy = rand(1,4)-0.5; % 产生随机的dy值y=hermite_interp(x,xd,yd,dy); % 插值计算plot(x,y,'k',xd,yd,'ko','markersize',10); % 绘图set(gca,'Fontsize',16)set(gcf,'Color','w');function y=hermite_interp(x,xd,yd,dy);% Hermite插值N = length(xd);% 计算插值点数据长度L = length(x);% 计算待求点数据长度X = repmat(x,N-1,1); % 扩展为矩阵Xy = 0; % 初始化yfor k = 1:N; xt = xd; xt(k) = []; % 去掉不满足条件的求和求积项 h=prod(1./[xd(k)-xt]); h=h*prod([X-repmat(xt',1,L)]); h = h.^2; % 计算h乘积因子 a = sum(1./[xd(k)-xt]); % 计算a乘积因子 y = y+h.*[(xd(k)-x)*(2*a*yd(k)-dy(k))+yd(k)];% 对y累加endex6:样条插值
N = 5; % 设定采样点数xd = linspace(-1,1,N); % 产生插值点yd = 1./(1+25*xd.^2); % 产生插值点x = linspace(-1,1,200); % 获得待求点坐标y = 1./(1+25*x.^2); % 正确的结果yL = lag_interp(x,xd,yd); % 拉格朗日插值rand('state',0); % 设定随机数状态dy = rand(1,N)-0.5; % 产生随机的一阶导数yH=hermite_interp(x,xd,yd,dy); % 进行厄尔米特插值subplot(221);plot(x,yL,'k:',xd,yd,'kx','markersize',8);hold on;plot(x,y,'k','linewidth',1);set(gca,'Fontsize',16);text(-0.8,0.5,'{\itN} = 5','Fontsize',16);xlabel('(a)');subplot(222);plot(x,yH,'k:',xd,yd,'kx','markersize',8);hold on;plot(x,y,'k','linewidth',1);set(gca,'Fontsize',16);text(-0.8,1,'{\itN} = 5','Fontsize',16);xlabel('(b)');%% N=10;N = 13;xd = linspace(-1,1,N);yd = 1./(1+25*xd.^2);x = linspace(-1,1,200);y = 1./(1+25*x.^2);yL = lag_interp(x,xd,yd);rand('state',0);dy = rand(1,N)-0.5;yH=hermite_interp(x,xd,yd,dy);subplot(223);plot(x,yL,'k:',xd,yd,'kx','markersize',6);hold on;plot(x,y,'k','linewidth',1);set(gca,'Fontsize',16);text(-0.7,-2,'{\itN} = 13','Fontsize',16);xlabel('(c)');subplot(224);plot(x,yH,'k:',xd,yd,'kx','markersize',8);hold on;plot(x,y,'k','linewidth',1);set(gca,'Fontsize',16);text(-0.7,150,'{\itN} = 13','Fontsize',16);xlabel('(d)');set(gcf,'Color','w');
ex7:用不同方法计算函数在【0,5】上的分段插值
x = 0:.5:5; % 生成插值点自变量数据% N=length(x); % 获得插值数据长度% Ik=randperm(N); % 产生一个随机排序序列% x = x(Ik); % 对x随机排序y = x.^2.*cos(x); % 计算插值点因变量数值xi = 0:.02:5; % 计算待求点自变量数据% xi=fliplr(xi); % 左右翻转向量ximethod = {'nearest','linear','spline','pchip','cubic','v5cubic'}; % 插值方法名数组for k=1:6; subplot(3,2,k); % 分布子图顺序 yi = interp1(x,y,xi,char(method(k))); % 用不同方法分段插值 yg = xi.^2.*cos(xi); % 计算理论值 plot(x,y,'ko',xi,yi,'k:',xi,yg,'k'); % 画数据点及绘制曲线 text(2,5,char(method(k)),'Fontsize',16); % 输出插值方法 set(gca,'Fontsize',14); % 重置坐标轴字体 xlim([min(x),max(x)]); % 设定横轴范围endset(gcf,'Color','w');
未完待续!
参考文献:
- 【2013-10-3前】Matlab笔记1
- matlab学习笔记 3
- matlab 学习笔记(1)
- matlab学习笔记 1
- Matlab学习笔记1
- Matlab学习笔记1
- matlab初学笔记1
- uclinux很久前笔记10
- uclinux很久前笔记3
- uclinux很久前笔记1
- OSPF笔记-前传 1
- Django学习笔记1(Django Book 前3章)
- MATLAB学习笔记(3)
- MATLAB学习笔记(3)
- MatLab学习笔记(1)
- 笔记1:MATLAB语言基础
- matlab学习笔记(1)
- matlab笔记(1)----基础
- getElementsByClassName
- 父进程为什么要创建子进程
- 教你如何电脑被盗还能找回
- 算法导论 之 希尔排序[C语言]
- C语言中break和continue的用法和区别
- 【2013-10-3前】Matlab笔记1
- 开博第一篇--为什么要开博
- Android多线程异步处理:AsyncTask 的实现原理
- 阶乘的零
- mysql的SQL_CALC_FOUND_ROWS 使用
- Linux对路径和文件长度的限制
- 搜索引擎中查询纠错概述
- Android Notifications通知
- 为系统添加root用户密码