关于matlab:基于Matlab的有限元网格自动生成算法-Q4Q8Abaqus单元网格

今日给大家带来的次要内容是二维问题下四边形单元有限元网格如何主动生成?单元网格的造成实际上属于有限元计算中的前解决局部,即确定单元节点信息,当模型较为简单时,用户可在Abaqus、Ansys等大型商业有限元软件中进行建模,导出网格信息。当模型较为简单时,如二维立体板模型,用户可基于一些较为根底的网格生成算法,在本人的程序中通过管制模型长、宽等信息,即可生成有限元网格。看似利用无限,然而在一些比较复杂的畛域内,往往须要先在简略的模型中失去实践验证,如此以来,有利于自编程代码的完整性,即前解决、内核计算、后处理于一体。本篇推文,木木就带着大家学习一下Q4、Q8单元网格的主动生成以及Abaqus网格节点程序解读。代码获取:基于Matlab的有限元网格主动生成算法 | Q4、Q8、Abaqus单元网格Q4单元网格单元主动网格划分如下图所示,为4节点四边形单元网格生成示意图,图中NXE和NYE别离是模型横向和纵向单元个数,dhx和dhy别离是单元的横向、纵向长度。单元主动网格划分立体板模型被划分为若干个小矩形区域,共有4个节点,别离是 、、、,一个矩形中是1个四边形单元。该模型总的单元数目和节点数目别离为 , 。网格生成算法代码(纵向排序)global nnd nel nne  nodof eldof  n global geom connec dee nf Nodal_loadsglobal Length Width NXE NYE X_origin Y_origin dhx dhy %%nnd = 0;k = 0;% 纵向排序for i = 1:NXE   for j=1:NYE        k = k + 1;        n1 = j + (i-1)(NYE + 1);        geom(n1,:) = [(i-1)dhx - X_origin    (j-1)dhy - Y_origin ];        n2 = j + i(NYE+1);        geom(n2,:) = [idhx - X_origin       (j-1)dhy - Y_origin  ];        n3 = n1 + 1;        geom(n3,:) = [(i-1)dhx - X_origin       jdhy - Y_origin  ];        n4 = n2 + 1;        geom(n4,:) = [idhx- X_origin       jdhy - Y_origin       ];        nel = k;        connec(nel,:) = [n1  n2  n4  n3];        nnd = n4;        endend代码解读采纳全局变量 global的模式,进行变量的传递;从两层循环构造上看,最外层是 for i = 1:NXE...end阐明网格划分的过程中,x不动,遍历每一个y,节点 纵向排序;先确定节点号 和 , n3 = n1 + 1、 n4 = n2 + 1阐明 和 在 和 的根底上,编码加1;n1 = j + (i-1)(NYE + 1)行不动,每次依照列减少,阐明 依照纵向排序;n2 = j + i(NYE+1)比 多了一列的节点,阐明 与 同行;、、、的坐标 geom由 绝对地位-坐标轴原点 (X_origin,Y_origin),该数值由主程序中给出;nel = k指的是每次循环中矩形个数,当两层循环完结时, nel指的是全副四边形单元的个数;connec(nel,:)指的是四边形单元节点编码程序;connec(nel,:) = [n1  n2  n4 n3]指的是该单元由 、、、节点组成, 并不是固定的,依照肯定的程序即可(顺时针或者逆时针);nnd = n4当循环完结时, 的数值就是节点的最大值,也就是节点的个数。网格绘制figure('Name','Q4单元有限元网格模型');patch('Faces', connec, 'Vertices', geom,  'Facecolor','none','EdgeColor','b',...   'LineWidth',2,'Marker','pentagram','MarkerSize',8,'MarkerFaceColor','r',...    'MarkerEdgeColor','r');axis off% 节点编号显示for i=1:nnd    txt =num2str(i);    text(geom(i,1)+dhx/10,geom(i,2)+dhy/10,txt);end% 单元编号显示(与单元节点编码程序无关)for j=1:nel    txt1 = num2str(j);    text(geom(connec(j,1),1)+dhx/2,geom(connec(j,1),2)+dhy/2,txt1,'Color','red','FontWeight', 'bold');endQ4单元网格生成(纵向排序)网格生成算法代码(横向排序)书中所给的代码一律纵向排序,我略微批改了一下,使得单元依照 方向横向排序,具体如下:global nnd nel nne  nodof eldof  n global geom connec dee nf Nodal_loadsglobal Length Width NXE NYE X_origin Y_origin dhx dhy %%nnd = 0;k = 0;% 横向排序for i = 1:NYE   for j=1:NXE        k = k + 1;        n1 = j + (i-1)(NXE + 1);        geom(n1,:) = [(j-1)dhx - X_origin    (i-1)dhy - Y_origin ];        n2 = n1 + 1;        geom(n2,:) = [jdhx - X_origin       (i-1)dhy - Y_origin  ];                n3 = j + i(NXE+1);        geom(n3,:) = [(j-1)dhx - X_origin       idhy - Y_origin  ];        n4 = n3 + 1;        geom(n4,:) = [jdhx- X_origin       idhy - Y_origin       ];        nel = k;        connec(nel,:) = [n1  n2  n4  n3];        nnd = n4;        endend代码解读从两层循环构造上看,最外层是 for i = 1:NYE...end阐明网格划分的过程中,y不动,遍历每一个x,节点 横向排序;先确定节点号 和 , n2 = n1 + 1、 n4 = n3 + 1阐明 和 在 和 的根底上,编码加1;n1 = j + (i-1)(NXE + 1)列不动,每次依照行减少,阐明 依照横向排序;n3 = j + i(NXE+1)比 多了一行的节点,阐明 与 同列;、、、的坐标 geom由 绝对地位-坐标轴原点 (X_origin,Y_origin),该数值由主程序中给出;nel = k指的是每次循环中矩形个数,当两层循环完结时, nel指的是全副四边形单元的个数;connec(nel,:)指的是四边形单元节点编码程序;connec(nel,:) = [n1  n2  n4 n3]指的是该单元由 、、节点组成, 并不是固定的,依照肯定的程序即可(顺时针或者逆时针);nnd = n4当循环完结时, 的数值就是节点的最大值,也就是节点的个数。网格绘制Q4单元网格生成(横向排序)绘图润饰家喻户晓,Matlab的可视化能力强的一批,接下来木木略微批改一下patch函数外面的参数,即可更改填充面的色彩以及标记的形态:批改绘图细节Abaqus-Q4单元在这个大节,木木想要根据本人的了解,解释一下:Abaqus-Q4单元节点编码程序为什么是1-2-4-3,而不是依照顺时针或逆时针的程序编排。如下图所示,是在Abaqus中建设一个CPS4(Q4)单元的节点程序:Abaqus-CPS4单元节点程序模型节点读取在Abaqus建设立体板模型,划分为 个单元,节点、单元编码如下图所示:Abaqus划分网格的节点单元编码由上图可知,Abaqus在进行CPS4单元节点编码时,时一排一排地排序,所以说,在一个单元中节点编码先是同一方向上的1-2,再是第二行的3-4。在Matlab中应用Readmesh.m函数,将.inp文件的节点、单元信息导入进Matlab中,命令如下:[geom,connec] = Readmesh('Q4_abaqus.inp');网格绘制figure('Name','Q4单元有限元网格模型');patch('Faces', connec, 'Vertices', geom,  'Facecolor','c','Marker','o','MarkerSize',4,'MarkerFaceColor','k');axis off% 节点编号显示[nnd,ntemp] = size(geom);[nel,netemp] = size(connec);for i=1:nnd    txt =num2str(i);    text(geom(i,1)+0.5,geom(i,2)+0.5,txt);end% 单元编号显示(与单元节点编码程序无关)for j=1:nel    txt1 = num2str(j);    text(geom(connec(j,1),1)-2.5,geom(connec(j,1),2)-2,txt1,'Color','red','FontWeight', 'bold');endAbaqus网格信息导入进Matlab由上图可看到,节点、单元程序与Abaqus显示统一。Q8单元网格单元主动网格划分如下图所示,为8节点三角形单元网格生成示意图,图中NXE和NYE别离是模型横向和纵向单元个数,dhx和dhy别离是单元的横向、纵向长度。单元主动网格划分立体板模型被划分为若干个小矩形区域,共有8个节点,别离是 、、、、、、、 ,一个矩形就是一个四边形单元。网格生成算法代码global nnd nel nne  nodof eldof  n global geom connec dee nf Nodal_loadsglobal Length Width NXE NYE X_origin Y_origin dhx dhy %%nnd = 0;k = 0;for i = 1:NXE   for j=1:NYE    k = k + 1;%     n1 = (i-1)(3NYE+2)+2j - 1;     n2 = i(3NYE+2)+j - NYE - 1;     n3 = i(3NYE+2)+2j-1;      n4 = n3 + 1;     n5 = n3 + 2;     n6 = n2 + 1;     n7 = n1 + 2;     n8 = n1 + 1; %    geom(n1,:) = [(i-1)dhx - X_origin    (j-1)dhy - Y_origin ];    geom(n3,:) = [idhx - X_origin       (j-1)dhy - Y_origin  ];     geom(n2,:) = [(geom(n1,1)+geom(n3,1))/2  (geom(n1,2)+geom(n3,2))/2];    geom(n5,:) = [idhx- X_origin       jdhy - Y_origin ];     geom(n4,:) = [(geom(n3,1)+ geom(n5,1))/2  (geom(n3,2)+ geom(n5,2))/2];    geom(n7,:) = [(i-1)dhx - X_origin       jdhy - Y_origin  ];    geom(n6,:) = [(geom(n5,1)+ geom(n7,1))/2  (geom(n5,2)+ geom(n7,2))/2];        geom(n8,:) = [(geom(n1,1)+ geom(n7,1))/2  (geom(n1,2)+ geom(n7,2))/2];   %        nel = k;           nnd = n5;    connec(k,:) = [n1 n2 n3 n4 n5 n6 n7 n8];   endend代码解读先确定节点号 、 、  , n4 = n3 + 1、 n5 = n3 + 2、 n6 = n2 + 1、 n7 = n1 + 2、 n8 = n1 + 1阐明 、 、 、 、 在 、 、 的根底上,编码加1、加2;留神 n1、 n2、 n3的编码构造,与下面示意图相符;的坐标 geom由 绝对地位-坐标轴原点 (X_origin,Y_origin),该数值由主程序中给出;nel = k指的是每次循环中单元个数,当两层循环完结时, nel指的是全副四边形单元的个数;connec(k,:)指的是8节点四边形单元节点编码程序;connec(k,:) = [n1 n2 n3 n4 n5 n6 n7 n8]指的是该单元由 、、、、、、、 节点组成, 并不是固定的,依照肯定的程序即可(顺时针或者逆时针);nnd = n5循环完结后,节点总个数等于最初一次循环的 n5编码号。网格绘制figure('Name','Q8单元有限元网格模型');patch('Faces', connec, 'Vertices', geom,  'Facecolor','c','Marker','o','MarkerSize',4,'MarkerFaceColor','k');axis off% 节点编号显示for i=1:nnd    txt =num2str(i);    text(geom(i,1)+dhx/10,geom(i,2)+dhy/10,txt);end% 单元编号显示(与单元节点编码程序无关)for j=1:nel    txt1 = num2str(j);    text(geom(connec(j,1),1)+dhx/2,geom(connec(j,1),2)+dhy/2,txt1,'Color','red','FontWeight', 'bold');endQ8单元网格主动生成本文的次要参考内容及Matlab代码均来自Amar Khennane编写的《Introduction to Finite Element Analysis Using MATLAB and Abaqus》,想要进一步理解有限元编程的小伙伴能够动手,强烈推荐!往期举荐 ...

February 9, 2023 · 1 min · jiezi

关于matlab:Linux端安装matlab记录

1 下载MATLAB R2018a for Linux full crack文件 链接: https://pan.baidu.com/s/1W6jW... 明码: igx6 1.没有装上matalb是这样的状态 一、具体装置过程如下图所示:1 抉择 Use a File Installation Keycd /mmt./iso/install2.抉择I have the File Installation Key for my license,输出:09806-07443-53955-64350-21751-41297装置到某个进度会提醒插入iso2,这个时候挂载R2018a_glnxa64_dvd2.iso 3.root下授予权限chmod 755 mnt/mount -t auto -o loop R2018a_glnxa64_dvd2.iso /mnt/iso4.装置实现二、激活|激活 1 复制破解文件Crack中license_standalone.lic到装置目录中 cd ~/Cracksudo cp license_standalone.lic /usr/local/MATLAB/R2018a/licenses2 复制Crack中的R2018a到装置目录 cd ~/Crackcp -r R2018a /usr/local/MATLAB至此激活实现|创立命令不便在任何终端都能够关上matlab 采纳软链接的形式在/usr/local/bin中创立启动命令matlab cd /usr/local/binln -s /usr/local/MATLAB/R2018a/bin/matlab matlab|收拾残局 勾销挂载,删除文件 umunt /mnt/isocd /mntrmdir iso

November 28, 2022 · 1 min · jiezi

关于matlab:Mac专业编程和数学计算软件MATLAB-R2022a

Matlab R2022a是一款用于数据分析的数学软件,通过应用Matlab咱们能够更加准确的对各种数据进行剖析,统计,从而拿到最有用的材料。MATLAB是面向工程师和科学家的最简略和最具生产力的软件,无论您要剖析数据、开发算法还是创立模型,MATLAB都提供了激励摸索和发现的环境,它将高级语言与针对迭代式工程和迷信工作流进行调整的桌面环境相结合。宽泛地利用于工程计算、管制设计、信号处理与通信、图像处理、信号检测、金融建模设计与剖析等畛域。

August 9, 2022 · 1 min · jiezi

关于matlab:MATLAB学习笔记

Keywordsans,i、j,Inf,eps(2.2204e-16),NaN,pi,~=(不等于),end(数组中最初一个) @ : can be used to pass a function to anotherfunction [y] = xy_plot(input, x)y = input(x); plot(x, y, 'r--');xlabel('x'); ylabel('f(x)');end==>xy_plot(@sin, 0:0.01:2*pi);Operations罕用函数who:variables in workspacewhos:variable information in workspacedisp():显示字符串。tic、toc计算中间代码执行工夫,预调配空间执行效率更高。Strlength()

April 8, 2022 · 1 min · jiezi

关于matlab:MATLAB将矩阵保存为TIFF并使用ImageJ查看

ImageJ在查看一些CT,IMA图片的时候还挺不便的,而且还有网页的版本。 imwrite(uint16(matrix),filepath)有两个小的留神点 如果间接用savefig的话,用ImageJ查看时看到的是这一点对应的色彩RGB值而不是信噪比,所以要用imwrite留神matrix中数值的范畴,如果是0-255能够用uint8应用imwrite能够简略的保留uint16类型的数组,然而如果是single或者double能够用如下的function保留为TIFF。残缺的一个matlab function如下,X是须要保留的二维数组。 function t = saveAsTiffSingle(X, filepath)% https://www.cnblogs.com/lionyiss/p/9552979.html im = single(X); t = Tiff(filepath,'w'); tagstruct.ImageLength = size(im,1); tagstruct.ImageWidth = size(im,2); tagstruct.Photometric = 1; % 每个像素的数值位数,single为单精度浮点型,对于32为零碎为32 tagstruct.BitsPerSample = 32; tagstruct.SamplesPerPixel = 1;% tagstruct.RowsPerStrip = 16; tagstruct.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; tagstruct.Software = 'MATLAB'; tagstruct.SampleFormat = 3; t.setTag(tagstruct) t.write(im); t.closeend

January 26, 2021 · 1 min · jiezi

关于matlab:Linux下Matlab的安装

1 概述笔者环境Manjaro,原本想间接通过yay装置的,但无奈失败了,于是间接从官网下载进行装置。 2 下载安装包Matlab官网能够戳这里,点击右上角的Get MATLAB就能够下载了: 没有注册账号的能够先去注册一个,举荐应用教育邮箱,这样会有一个收费的凭证,实现注册并填写相干信息激活后抉择Linux下载即可: 3 解压装置下载的是一个zip压缩包,应用unzip解压后,会有一堆文件: 运行其中的install装置即可: sudo ./install另外还能够看到提供了装置文档,十分贴心的提供了中文文档: 运行后会呈现如下装置界面,输出注册的邮箱即可: 抉择批准: 接下来是抉择地位,因为Matlab装置须要较多空间,能够先应用df -h查看磁盘占用状况: 接下来是抉择对应的组件进行装置,有工夫有空间能够抉择Select All: 再接着是抉择是否装置运行脚本与是否发送用户体验信息: 抉择凭证,这里的凭证笔者应用邮箱注册时就主动带了一个凭证: 开始装置: 装置实现: 4 装置后装置后能够间接运行 matlab启动,或者进入Matlab装置文件夹下的bin运行matlab: 为了不便能够增加一个桌面入口,增加一个desktop: sudo vim /usr/share/applications/matlab.desktop增加如下内容: [Desktop Entry]Version=R2020bType=ApplicationTerminal=falseMimeType=text/x-matlabExec=/usr/local/MATLAB/R2020b/bin/matlab -desktopName=MATLABIcon=matlabCategories=Development;Math;ScienceComment=Scientific computing environmentStartupNotify=true其中版本以及Exec请依据本人的版本以及装置门路进行批改,其余放弃默认即可,如果不想看到启动画面能够应用-nosplash参数: Exec=/usr/local/MATLAB/R2020b/bin/matlab -desktop -nosplash增加后就能够在桌面菜单搜寻到了,启动即可: 至此装置实现。

October 16, 2020 · 1 min · jiezi

关于matlab:MATLAB最-最最最基础教程

前言:matlab字面意思是矩阵实验室,软件重点是数值变量的运算。所以在符号变量和字符串的运算上,性能并不弱小,我用的也不是很多,因而这篇的内容请多多斧正。 1.符号变量的根本运算 符号变量的根本运算与数值变量一样,加减乘之类的,比方 syms x y(x) g=x*y 并没有须要特地阐明的。 2.符号变量的非凡运算 符号变量的非凡运算也与数值变量一样,但一般而言,符号变量都是11矩阵,因而非凡运算与根本运算个别都是等效的。比方g=xy和g=x.*y的运算后果齐全一样。 3.符号变量的罕用函数 数值变量的罕用函数,个别都能够间接用在符号变量上,比方三角函数 syms x y=sin(x) a=1 b=sin(a) 这些都是能够通用的,而且函数的含意也齐全一样。 但偏偏有些函数十分蛋疼,对符号变量与数值变量都能够进行操作,但操作的含意齐全不同,比方diff,diff对于一个数值变量的运算后果是差分,而对于一个符号变量的运算后果则是求导 syms x f=diff(sin(x)) a=[1 2 3] b=diff(a) 运算进去的f是sin(x)的导数,也就是cos(x),仍然是个符号变量,而b运算后果则是一个差分向量。 另外也存在很多函数只能对数值变量操作,比方离散傅里叶变换fft。还有很多函数只能对符号变量操作,比方泰勒开展taylor。因而在matlab应用中,肯定要辨别变量的类型,其实真的用起来也好辨别,因为实现特定的计算工作,要么全副用数值,要么全副用符号,这也合乎个别解决问题的准则。 我平时做符号运算比拟少,用到的函数,除了exp、sin这类数学运算外,还有: int 求积分,符号运算特有,能够求定积分,也能够求不定积分,但个别不会写+C diff 求导数,符号运算特有 limit 求极限,符号运算特有 ezplot 作图,相似数值变量运算时的plot 4.字符串的罕用函数 matlab中字符串的罕用算符就更少了,但都十分有用,这里介绍几个: num2str和str2num 能够实现数值变量和字符串变量的转换,比方 a=1 b=num2str(1) 运算结果显示a是一个数值变量,b是一个字符串变量,函数名中的2就是英文中to的意思,也就是把num数值类型转化成str字符类型。str2num就是这个函数的反函数,这两个命令联合,能够实现特定的性能,比方提取一个数字的最高位: a=123456 b=num2str(a) c=b(1) d=str2num(c) 另一个罕用函数是eval,其原理是把“字符串”变成“命令”并执行。但应用过程中须要留神的是,这个命令不能够“编译”,也就是只能在matlab内应用,无奈移植到C,JAVA等其余语言平台。有须要的能够自行尝试这个命令。

September 11, 2020 · 1 min · jiezi

关于matlab:MATLAB最最最最基础教程

前言:上一篇说了变量的类型和赋值,这里接着说这些变量的根本运算,捎带一些罕用的零碎自带的函数,通过这些运算和函数,曾经能够实现一些简略的计算了。 1.数值变量的根本运算 数值变量都是矩阵,矩阵之间最根本的运算有加、减、乘(方)、转置,运算符别离是+-*',与数学中的个别示意无异,但仍有一些中央须要留神,以下联合代码进行阐明。 1)矩阵加减法只有维度雷同的矩阵能力进行,例如 a=[1 2] b=[1 3] c=[1;2] 则d=a+b和d=a-b都是能够进行的,因为a和b都是1行2列,但d=a+c则无奈进行,因为数学上,不同维度的矩阵加减法并没有定义。 2)矩阵乘法只有第一个矩阵的列数等于第二个矩阵的行数时,能力进行,例如上段代码中的abc,则d=ac是能够进行的,但d=ab则不能进行,起因同样是因为这种计算在数学上没有定义。还有一种非凡的乘法,也就是乘方,例如A=[1 2;3 4]状况下B=A*A这样的矩阵乘法能够写成B=A^2,当然,数学上规定,只有方阵能力进行乘方。 3)矩阵与数乘除,因为数也能够看做11的矩阵,因而这是一种非凡的矩阵乘除法,和数学上定义一样,比方d=a2和d=a/2,这些都能进行。 4)转置,任何维度的矩阵都能够进行转置,例如d=a'就会将a这个行向量转置,失去一个列向量d。须要留神的是,这种运算更精确的说法是共轭,对实数矩阵而言,这两种说法并没有什么区别,但对复数矩阵而言,共轭的意思,不仅是把a(i,j)和a(j,i)替换地位,更要把所有元素的虚数局部乘以-1。 2.数值变量的非凡运算 和其他软件不同,matlab里提供了一些很有意思的运算符,有点乘.、点除./和点方.^,这些运算符在自身的运算符前加一个点,能够实现很弱小的性能,但因为和个别的运算符太像,也造成了很多人混同。这些运算符有很多叫法,比方.,个别称为点乘、元素乘、数乘,这些叫法都是为了让这个运算符区别于一般的乘,有时为了强调这种区别,也把通常的乘叫矩阵乘。 简略而言,这些运算的含意是将矩阵作为个别的数来进行运算,比方 [1 2 3].[4 5 6]=[14  25  36] [1 2 3]./[4 5 6]=[1/4  2/5  3/6] [1 2 3].^3=[1^3  2^3  3^3] 所以这里点乘和点除须要留神,只有同样维度的矩阵能力进行这种非凡运算。另外点除还要留神不要除以零,尽管matlab并不会报错,但除以零在数学上没有定义,所以这种除法其实曾经失去了意义。 于是,什么时候用矩阵乘,什么时候用点乘,其实是看计算的目标,但有些时候,这两种运算符确实是等效的: 1)数字的乘除,11和1.1,当然后果雷同 2)矩阵与数字的乘除,1a和1.a,后果也是一样的 3.数值变量的罕用函数 这里的函数都能够通过doc+函数名查到更具体的帮忙,因而仅列出典型用法。 a=ones(3)或者a=ones(1,5)生成指定大小的全1矩阵 a=zeros(3)或者a=zeros(1,5)生成指定大小的全0矩阵 a=eye(3)生成指定大小的单位方阵 inv([1 2;3 4])矩阵求逆,只能对方阵操作。matlab有左除法,通常更高效,如有须要也可尝试 size([1 2;3 4])取得矩阵的行数和列数,也能够通过size([1 2;3 4],1)独自取得行数或者列数 length([1 2 3])取得向量的长度,这个命令也能够对矩阵操作,当然个别只对向量操作 max([1 2 3])和min([1 2 3])取得向量的最大和最小值,也能够对矩阵操作 sort([2 1 3])按大小对向量进行排序,也能够对矩阵操作 sum([1 2 3])求和,也能够对矩阵操作 ...

September 11, 2020 · 1 min · jiezi

关于matlab:MATLAB-最最最最基础教程

matlab最基础教程(二):变量类型与赋值 前言:matlab解决问题的最基本思路是建设脚本文件,那么脚本文件的第一段就是定义一些变量,这和C语言等编程思维是一样的。matlab提供的变量类型很多,最根底的是三种:数值变量、符号变量、字符串,其余的类型还有cell、table等。这里仅阐明最根底的变量类型。 1.数值变量     matlab中所有的数值变量都是矩阵,赋值时,以方括号作为结尾和结尾,以英文逗号或空格宰割同行元素,以英文分号宰割各列。例如在Command Window里输出 a=[1 2;3 4] 能够看到运算后果,a是一个数值变量。同时workspace里呈现一个田字形的变量a,阐明变量a的类型是数值型。     向量和数字能够视为非凡的矩阵,例如 a=[1 2] a=[1;2] 别离是行向量和列向量, a=[1] 能够简写为 a=1 复制代码 是数字。 数值变量的命名要求是英文字母结尾,不能蕴含特殊符号,大小写敏感。这里举荐采纳下划线来进行宰割,例如value_of_A,这和其余编程语言的命名规定大体相当。 赋值中,有时须要用到等差数列,例如定义一个向量a=[1 2 3],如果比拟长,赋值很麻烦,所以matlab提供了一个简略的办法 a=[1:1:3] 这里两个冒号的意思是起始值:步长:终值。采纳这种赋值形式时能够取得一个等差数列行向量,并能够省略两侧的方括号。当步长为1时,能够省略步长和一个冒号,于是能够简写为 a=1:3 另一种灵便的赋值办法是分块矩阵,其办法是变量名前面加圆括号,圆括号中加序号。例如 a=[1 2;3 4] 定义变量a之后, b=a(1,2) 就能够把a的第一行第二列元素赋值给b,当然也能够用 a(1,2)=1 来批改矩阵中局部元素的值。这里须要留神,序号必须是自然数,且不能是零。当矩阵中有多个元素须要赋值时,能够将序号局部改成向量,例如 a([1 2],[1 2])=[1 2;3 4] 中把行数和列数都用向量示意,就是说对矩阵a的第1和2行,第1和2列,总共4个元素赋值。更进一步,也能够有a([1 2],1)示意a的第一列,也能够写成 a(1:end,1) 这里的end示意起点,即a的行数2,也能够更进一步简写成 a(:,1) 这里的冒号示意从头至尾。这类赋值办法最为罕用,但根本的语法非常简单,方括号示意矩阵结尾和结尾,圆括号示意从矩阵中选取局部,把握这个准则,有利于读懂程序。 当然分块矩阵也能够 b=[a a] 这样的赋值办法,但须要留神的是,方括号中的元素必须满足矩阵的行列数要求,例如 a=[1 1] b=[1;1] c=[a b] 就会引起谬误,因为此时matlab无奈确定c的行列数。 2.符号变量 总体而言,符号变量比数值变量简略得多,因为变动非常少,罕用的赋值命令是 ...

September 9, 2020 · 1 min · jiezi

关于matlab:MATLAB最最最最基础教程

matlab最基础教程(一):软件基本概念前言:①如果你是第一次应用matlab,倡议浏览本教程。,程度无限,欢送斧正。 1.matlab的界面 左上角,home标签下,找到layout进行设置/复位,能够设置各板块的显示与暗藏。其中有几个局部,请务必要显示 ①Current Folder:中文个别翻译成工作门路,个别设置成一个本人建设的、有读写权限的文件夹,例如我的文档下建设一个matlab文件夹 ②Command Window:字面意思是命令窗口,用来运行代码,所有的代码都是在这里输出 ③Workspace:字面意思是工作空间,其实就是暂存所有运行后果的中央,“暂”的具体含意是:敞开matlab后失落 2.软件中的基本概念 2.1 函数 matlab之所以弱小,就是因为提供大量的函数,你也能够建设自定义函数,办法是:Home->New->function。自定义函数个别保留在工作门路下。函数文件的特色是:扩展名m,内容的第一行以function结尾,后续内容是“输入变量=函数名(输出变量)”。且函数名和文件名雷同。 每个函数在Command Window中运行,用来实现特定的计算工作,运行形式是输出“输入变量=函数名(输出变量)”,而后按回车。例如有个零碎自带的函数是用来求绝对值的,函数名abs,所以在Command Window里输出“a=abs(-1)”,就会显示运算后果为“a=1”。且运算后果会在Workspace里呈现一个变量a,双击后可看到a的值是1。 2.2 脚本 能够了解为非凡的函数,这种函数内容的结尾没有function那行,因而没有输出、输入变量,也没有函数名。文件扩展名和函数一样是m,也须要在Command Window里运行。脚本都是用户建设的,办法是:Home->New Script。个别保留在工作门路下。脚本的性能就是实现用户须要的、简单的计算工作,通常脚本里会调用很多函数。 2.3 GUI 个别翻译为界面,就是人机交互界面的意思。写脚本解决问题的办法有点麻烦,让人看起来更像是码农,所以当初很多问题能够通过界面点点鼠标解决。这时候就须要关上界面,关上办法是:在APPS标签里能够找到所有已装置的GUI工具,单击即可。留神左边有个小三角能够点开。和函数一样,用户也能够本人建设自定义GUI,这部分较为简单,对老手而言有点边远。 2.4 toolbox 个别翻译成工具箱,matlab将性能相近或者利用上自成体系的一组函数和GUI打包成一个toolbox。正版的matlab在购买时,简直每一个toolbox都是要独自免费的,所以toolbox也能够了解为matlab产品的模块,一个工具箱就是一个产品/商品。 2.5 simulink 个别用matlab解决问题的过程是:用户自定义脚本,在Command Window里运行脚本。而脚本的运行逻辑是程序执行,和个别的编程一样。simulink则提供另一种思路,图形化编程,有点像labview,这种办法很适宜于物理模型的仿真,因而有时用“matlab编程”和“simulink仿真”强调。应用办法是在home标签下点击simulink。 3.取得帮忙 罕用的取得帮忙有四种办法 ①home标签里,有个Help标记,点开后能够取得各工具箱/产品的残缺帮忙文档。新版本中默认应用在线,改用本地帮忙的方法是在home标签里,Preferences下的matlab/Help里抉择installed locally ②cn.mathworks.com官网上找到反对,而后能够取得教程。这种办法取得的帮忙文档和第一种办法一样。 ③在Command Window里输出 doc+函数名 来取得帮忙。比方输出"doc fft"能够取得离散傅里叶变换函数fft的帮忙和范例。这种办法取得的文档是前两种办法文档中的局部。当然,前提是你要晓得函数名,能力找到帮忙。这种办法适宜于取得零碎自带函数的应用阐明。 ④应用GUI时,通常界面的角落里有Help,点开能够取得帮忙。这种办法取得的文档是第一和第二种办法文档中的局部。这种办法适宜于取得零碎自带GUI的应用阐明。 这几种办法中,最罕用的是第三种,只有晓得本人须要的函数名,就能够用这种形式取得阐明和范例。而理论应用中,个别罕用的零碎自带函数,也并不是十分多,大略几十个?真正须要牢记应用办法的可能就几个,通常都是晓得函数名,要用的时候doc一下。

September 9, 2020 · 1 min · jiezi

关于matlab:MATLAB最最最最基础教程

MATLAB最基础教程(零):根本数学概念前言:matlab只是个软件,用来实现机械的计算,而如何安顿这些计算,须要用户把握最根本的数学概念。这篇将介绍工程数学中罕用的数学概念,与matlab仿佛并不相干,但实则是matlab的根底。1.数值与符号 如果给工程数学问题分类,最大的两类必定是数值问题和符号问题,对应matlab的数值运算和符号运算。简而言之,数值运算就是所有的变量的值已知,求解的也是一些具体的值;符号运算则刚好相同,不要求所有的变量都已知,求解的后果也不是变量具体的值,而是变量之间的关系。一个简略的例子是 ①数值问题:求解一元二次方程,ax2+bx+c=0,其中a=b=c=1,所求得的后果肯定是x=几点几+几点几i,是个复数,是个具体的数值。 ②符号问题:求解一元二次方程,ax2+bx+c=0,所求的的后果肯定是x=求根公式,是abc的函数,是个关系 可见,一个问题是数值问题还是符号问题,很大水平上决定于后果须要求解的是数值还是关系。当然两个问题也能够互相转化,比方数值问题的一元二次方程,咱们个别会先转化成符号问题,把abc代入求根公式,求进去变量x的具体数值。但理论中,个别咱们并不举荐这样做,起因是matlab的数值和符号是齐全不同的两套零碎,互相转化不仅须要多余的数值符号转换语言,更可能带来查错的不便。 2.典型数值问题 以下是常见的数值问题,文中提到的解法均可在数值计算、科学计算、数值算法这类书中找到。 2.1代数方程 代数方程又分为线性方程和非线性方程,线性方程个别能够转化为矩阵模式AX=b,对A求逆即可。求逆的数值解法个别有高斯赛德尔迭代,超松弛迭代等。非线性方程个别转化为f(x)=zeros其中x是个向量,右侧的zeros示意f是个多输入函数,数值解法个别是迭代,常见的有牛顿迭代,最速梯度,点斜式等。 2.2常微分方程 常微分方程个别转化为Dy=f(y,t),且y(0)=y0是初始条件,其中y和Dy都是向量,f也是个多输入函数,数值解法有欧拉法,龙格库塔法。 2.3偏微分方程 偏微分方程比较复杂,matlab解决偏微分方程也不业余,我也简直不必matlab解决这类问题。但工程数学上,偏微分方程的解法有两类,差分法和有限元法。差分法须要采纳核心差分,顶风差分等。有限元须要计算刚度矩阵等。 2.4插值和拟合 插值和拟合是齐全不同的两个数学概念,尽管很多时候很多人都混同了。两者的形容都能够归结为:已知函数上的点(x1,y1),(x2,y2)...(xn,yn),求一个已知的x,对应的y的数值。插值罕用的多项式插值,三次样条插值。拟合的实质是一个最优化问题,其中最罕用的一种拟合是线性拟合,求解办法是最小二乘法。 2.5离散周期傅里叶变换 严格说来,这并不能算一个数学问题,只是一种运算形式,就如同加减乘除一样。特殊性在于这种变换是对于一个向量进行,且运算后的后果仍然是个向量。这里提出来是为了强调这种傅里叶变换的限定,要求是离散周期,这也是数值办法能解决的惟一一种傅里叶变换。 2.6最优化问题 最优化问题比拟宽泛,个别能够归结为求指标函数f(x)的最大或者最小值,其中f是一个单输入的函数,x是一个向量。其中x须要满足线性约束条件、非线性约束条件、上下界。具体的解法有最速梯度,遗传,蚁群,退火等算法。 2.7数值积分 已知函数上的点(x1,y1),(x2,y2),...(xn,yn),求函数在x1到xn的定积分。常见算法有矩形公式,梯形公式,辛普森公式。相似的问题还有数值求导。 3.典型符号问题 以下是常见的符号问题,须要特地指出的是,无解问题。数值问题中也有一部分无解问题,但大多数工程中是碰不到的。而符号问题恰好相反,绝大部分咱们遇到的符号问题都是没有解的,或者精确的说,没有解析解。比方求一元五次方程,咱们晓得x和这些系数存在关系,但无奈写出显式的表达式,也就是说没有解析解。 3.1递推转通项 这个问题能够归结为:已知xn+1=f(xn),求xn,常见于数列的推导。 3.2代数方程 区别于数值问题中的代数方程, 这里的代数方程问题能够形容为:f(x,c)=0,求x=x(c),这里须要求解的其实是x和c的关系。 3.3常微分方程 区别于数值问题中的常微分数方程, 这里的代数方程问题能够形容为:Dy=f(y,t,c),求y=x(t,c),个别无需初值条件。 3.4符号积分 区别于数值问题中的数值积分,这里的符号积分能够形容为:已知函数关系y=f(x),求y的不定积分。同样的问题还有符号求导。

September 9, 2020 · 1 min · jiezi

关于matlab:Plot-Tiny-Tricks-for-MATLAB-绘图的小技巧

MATLAB plot Tiny Tricks -- by Optic_cssUse set(gca, ·, ·, ·, ···) HANDLE for editing[纪录] 这里是我常常应用的MATLAB制图Code,记录下来是为了当前更快地实现一些根本的制图Setting类的操作,换句话说,当作查阅的备用叭... ... 上面所展现的Codes是一些根本的绘图Setting,很容易能看懂,根本蕴含了对于一张图像 'colormap''grid''box''xtick'、'ytick'、'LinwWidth'、'FontName'、'Color''xlabel'、'ylabel'、'title'、'legend''axis'的设置,这样曾经算是根本满足了需要... ... % Close all image windowsclose all;%———————————————————————————————————————————————————%|···········Plotting/Facing Codes Here············|%———————————————————————————————————————————————————% Retain control of the current diagram windowhold on;% 逆転/バック・キック colormapcolormap(flipud(othercolor('Spectral9')));% colormap(othercolor('Spectral9'));% Add a plaid shadinggrid on;% Remove the outer frame of the drawing windowbox off;%———————————————————————————————————————————————————%|·········Use set(·) to Change the style··········|%———————————————————————————————————————————————————% set(gca,'xticklabel',roundn((50:50:500)*deltal,-1));set(gca,'xtick',20:20:180);% set(gca,'yticklabel',roundn((50:50:500)*deltal,-1));% set(gca,'yTickLabel',num2str(get(gca,'yTick')','%.12f'));set(gca,'ytick',50:50:500);set(gca,'Linewidth',1.5);set(gca,'FontName','Times New Roman');set(gca,'Color',[1.000000000000000 0.388235294117647 0.278431372549020]);%———————————————————————————————————————————————————%|·················set the labels··················|%———————————————————————————————————————————————————xlabel('\xi');ylabel('\xi');title('\xi');legend('相邻方向差分值','FontName','微软雅黑');%———————————————————————————————————————————————————%|······Axis setting, use the handle axis(·)·······|%———————————————————————————————————————————————————axis([0 5400 30 80]);legend(['$\bar{x}(\lambda)$';'$\bar{y}(\lambda)$';'$\bar{z}(\lambda)$'],'interpreter','latex');上面则是一个小trick,对于如何将图窗background变通明的Setting办法,次要是前面对于'InvertHardCopy'的setting,这是属于某个凶恶分享者的资源, ...

September 8, 2020 · 2 min · jiezi

关于matlab:做开源界的MATLAB这个项目需要更多热爱开源的你加入

MATLAB 和 Mathematica、Maple 并称为三大数学软件。它在数学类科技应用软件中在数值计算方面名列前茅。MATLAB 能够进行矩阵运算、绘制函数和数据、实现算法、创立用户界面、连贯其余编程语言的程序等。 前一段时间 MATLAB 进入实体清单实际,也让局部国内开发者有了危机意识,明天介绍的这款我的项目就是试图打造「开源界的 MATLAB」,目前我的项目刚刚起步,还须要更多酷爱开源或 MATLAB\PyQt\Python 的技术大牛退出。 项目名称: PyMiner 我的项目作者: py2cn 开源许可协定: GPL-3.0 我的项目地址:https://gitee.com/py2cn/pyminer 我的项目简介 PyMiner 是一款数据处理、数据分析、数据建模、数据评估、数据可视化的工具,根本目标是使pandas、sklearn的操作进行可视化,用更加易于操作的模式实现数据科学家相干工作。 我的项目开发环境基于Window 10 x64,应用 Python3.8+PyQt5.15+Pycharm 进行技术开发。 我的项目预览 开发者说PyMiner 的落地,离不开宽广的算法工程师的群智,而目前国内搞算法这一块的,基本上Python 语言是支流的,C++ 速度的确是快,当然我自身就是搞 C++ 的,然而它入门门槛略高,开发效率慢,而且更重要的一点是,如果代码品质参差不齐,速度其实也很个别。当初PyMiner 刚刚起步,缺技术人才的反对,更缺做事的人,在这种状况下,咱们只能给各个行业的精英,起到搭建起咱们的平台,给牛人施展的舞台的作用,因而,能起到最便捷的桥梁作用的,就是 Python 了。当然,前期是否用 C++ 重构,则要看多方面因素了。咱们 PyMiner 团队心愿就 PyMiner 抛个砖,能吸引更多技术人才和做事的人独特实现国产开源 MATLAB 的指标。 须要更多开发者退出我的项目评论区内的探讨十分热烈,Gitee 也心愿通过我的项目举荐这样的形式,吸引更多开发者退出进来,实现这个我的项目从零到一的落地。 如果你也想退出他们,成为开源版 MATLAB 中的一员,那么就点击前面的链接,返回我的项目主页理解详情吧:https://gitee.com/py2cn/pyminer

August 31, 2020 · 1 min · jiezi

关于matlab:哈工大实惨全国大学生数学建模竞赛中被禁用-MATLAB

美国禁止哈工大和哈工程应用 MATLAB 一事又起波澜。 美国的实体清单范畴不断扩大,从科技公司到钻研机构再到高校都未能幸免。往年 6 月,美国将哈尔滨工业大学和哈尔滨工程大学也列入其中,并禁止这两所高校持续应用 MATLAB。 过后,MATLAB 的开发公司 MathWorks 向哈工大和哈工程的用户发送了一封邮件示意,“因为美国政府最新的进出口管制名单,无奈持续为这两所高校的用户服务。” 2020 年全国大学生数学建模比赛将于 9 月 10 日开始,在本届全国大学生数学建模比赛中,除了哈工大和哈工程两所大学的参赛选手,其余高校均能够应用 MATLAB,哈工大参赛学生公开质疑了此次较量的公平性。 忽然发表禁用,选手质疑较量公平性就在参赛学生们踊跃备战时,大赛组委会却忽然告诉“哈工大参赛队伍不能应用 MATLAB”。 收到这忽然的告诉,哈工大参赛队伍认为较量存在不公平性,而且此前报名须知中并未提到不容许应用 MATLAB 的条款。更讥刺的是,本届全国大学生数学建模比赛还是由 MATLAB 的开发公司 MathWorks 资助举办的。 据理解,《全国大学生数学建模比赛章程和参赛规定(2019年修订稿)》公布时,美国还没有对哈工大和哈工程收回禁令,所以过后的文件中并未提到无关禁止哈工大参赛队伍应用 MATLAB 的条款。但禁令公布后,赛事主办方和 MathWorks 并未提出应答措施,也未对参赛选手作出阐明。 目前,除了哈工大参赛学生对较量公平性的质疑,哈工大官网和 MathWorks 官网都尚未做出对于此事的侧面回应。 赤手空拳上阵?全国大学生数学建模比赛开办于 1992 年,是目前世界上规模最大的数学建模比赛之一,每年都会吸引来自寰球高校的学生报名参赛。2019 年,共有来自中国、美国、马来西亚等国共 1490 所高校的 13 万学生加入。 MATLAB 是美国 MathWorks 的一款商业数学软件,是用于算法开发、数据可视化、数据分析以及数值计算的高级计算机语言和交互式环境。其中蕴含大量计算算法的汇合,领有600多个工程中要用到的数学运算函数 始终以来,MATLAB 都是全国大学生数学建模比赛中选手们首选的软件。在通常状况下,MATLAB 能够用它来代替底层编程语言,如 C 和 C++ 。在计算要求雷同的状况下,应用 MATLAB 的编程工作量会大大减少。 不容许哈工大参赛队伍应用 MATLAB 无异于让哈工大选手赤手空拳迎战铠甲齐备的对手。 科技自主迫不及待在官网未做出回应之前,本届全国大学生数学建模比赛是否会更改规定,是否如期举行还是未知数。 但美国禁止中国高校应用 MATLAB 的威逼曾经逐步露出,这曾经对中国高校的科研教育造成了微小影响。 在此之前,哈工大和哈工程早已购买了 MATLAB 的正版受权,MathWorks 也始终与国内高校放弃着良好的关系。禁令颁发后,MathWorks 官网也强调,“依据美国政府最新的进出口管辖名单做出此决定,实属无奈。” ...

August 25, 2020 · 1 min · jiezi

matlab之solve函数

Matlab的solve()函数的使用方法1.首先是对方程的求解不废话直接上例子syms x;eq=x^2+2*x+1;s=solve(eq,x);结果如下完美的算出了方程的解现在对上面的代码进行一些说明1.syms x;是必要的,这将会把x设为符号变量。2.eq=x^2 +2*x+1;eq也会变为一个符号变量用于储存方程x^ 2+2*x+12.s=solve(eq,x);中方程的结果由solve函数返回,存储在s里。注意(eq,x)中x是说明eq这个方程中x为变量。这个看起来没有什么用但是对下面这个方程就有些意思了:a*x+2=0如果把a看为变量的话方程的解就是-2/x。如果把x看为变量的话方程的解就是-2/a。我们看一下下面的结果: 是不是很有意思? 2.接下来是对方程组的求解例子如下(和上面差不多就是solve的参数变成了两个方程)结果及例子如下图: s = 包含以下字段的 struct: x: [1×1 sym] y: [1×1 sym]>> s.x这代表:x,y各有一解由于答案存储在s中,所以可以用s.x和s.y调出方程的具体解 今天就到这里,这是本人的第一篇博客,以后争取每一到两个星期写一篇有关matlab,数学建模,平时学习的一些笔记心得。其实很多时候不是没有时间而是把时间用到了没有意义的事情上了。马上大二了,我一定要好好利用时间,cherish the time!

August 19, 2019 · 1 min · jiezi

Matlab中用subplot显示的图像加标题

问题:在这种状态下,显示的结果中图像上方是没有标题的;原因:title语句的位置不对;matlab真。。。。。正常的思维不应该是先有标题再显示图像吗?解决方法:换title位置。如下:So easy!笑哭 哭笑 笑出眼泪 破涕为笑 笑死 笑尿 笑cry

April 2, 2019 · 1 min · jiezi

用Python学数学之Sympy代数符号运算

在我们初、高中和大学近10年的学习时间里,数学一直占据着非常大的分量,但是回忆过去可以发现,我们把大量的时间都花在反复解题、不断运算上,计算方法、运算技巧、笔算能力以及数学公式的记忆仿佛成了我们学习数学的全部。这些记忆和技巧没几年就忘掉了,但很多人甚至还记得那份阴影;笔算与解题在AI、图形图像、数据分析等上被软件所取代。那我们学生时代的数学还剩下什么呢?计算器与数学说起数学计算器,我们常见的是加减乘除四则运算,有了它,我们就可以摆脱笔算和心算的痛苦。四位数以上的加减乘除在数学的原理上其实并不难,但是如果不借助于计算器,光依赖我们的运算能力(笔算和心算),不仅运算的准确度大打折扣,而且还会让我们对数学的运用停留在一个非常浅的层次。尽管四则运算如此简单,但是多位数运算的心算却在我们生活中被归为天才般的能力。但是数学的应用应该生活化、普及化,而不是只属于天才的专利,计算器改变了这一切,这就是计算器的魅力。计算器还可以做科学运算,比如乘方、开方、指数、对数、三角函数等,尽管这些知识在我们初中时代,通过纸笔也是能运算起来的,但是也仅限于一些极其常用和简单的运算,一旦复杂起来,通过纸笔来运算就是一项复杂的工程了。所以说,计算器可以让我们离数学的应用更近。但是我们学生时代所学的数学可远不止这些,尤其是高等数学(微积分)、线性代数、概率统计等数学知识应用非常广泛(我也是后来才知道),但是由于他们的运算非常复杂,我们即便掌握了这些知识,想要应用它又谈何容易,那有没有微积分、线性代数、概率统计等的计算器呢?答案是有的,它们就是计算机代数系统Computer Algebra System,简称CAS,Python的Sympy库也支持带有数学符号的微积分、线性代数等进行运算。有了计算器,我们才能真正脱离数学复杂的解题本身,把精力花在对数学原理和应用的学习上,而这才是(在工作方面)数学学习的意义。计算机代数系统Sympy可以实现数学符号的运算,用它来进行数学表达式的符号推导和验算,处理带有数学符号的导数、极限、微积分、方程组、矩阵等,就像科学计算器一样简单,类似于计算机代数系统CAS,虽然CAS通常是可视化软件,但是维基百科上也把Sympy归为CAS。几大知名的数学软件比如Mathematica、Maxima、Matlab(需Symbolic Math Toolbox)、Maple等都可以做符号运算,在上篇文章中我们已经拿Python和R、Matlab对比了,显然Python在指定场景下确实优势非常明显,于是我又调研了一下Sympy与Mathematica的比较,在输入公式以及生成图表方面,Sympy确实不行(这一点Python有其他库来弥补),Mathematica能够做什么,Sympy基本也能做什么。所以说Python在专业数学(数学、数据科学等)领域,由于其拥有非常多而且强大的第三方库,构成了一个极其完善的生态链,即使是面对世界上最为强势最为硬核的软件也是丝毫不虚的。本专栏用Python学数学的下一期也会介绍一些非常实用的数学工具和数学教材资源,让数学的学习更简单更生动。Sympy的符号运算如果之前是学数学相关专业了解计算机代数系统CAS,就会对数学符号的运算比较熟悉,而如果之前是程序员,可能会有点不太明白,下面我们就来了解一下。Sympy与Math函数的区别我们先来看一下Sympy库和Python内置的Math函数对数值计算的处理有什么不同。为了让代码可执行,下面的代码都是基于Python3的完整代码。import sympy,mathprint(math.sqrt(8))print(sympy.sqrt(8))执行之后,结果显示为:2.82842712474619032sqrt(2)math模块是直接求解出一个浮点值,而Sympy则是用数学符号表示出结果,结合LaTex的语法就可以得出我们在课本里最熟悉的的:$2\sqrt{2}$。数学符号与表达式我们要对数学方程组、微积分等进行运算时,就会遇到变量比如x,y,z,f等的问题,也会遇到求导、积分等代数符号表达式,而Sympy就可以保留变量,计算有代数符号的表达式的。from sympy import x = Symbol(‘x’)y = Symbol(‘y’)k, m, n = symbols(‘k m n’)print(3x+y**3)输出的结果为:3x + y3,转化为LaTex表示法之后结果为$3x+y^3$,输出的结果就带有x和y变量。Symbol()函数定义单个数学符号;symbols()函数定义多个数学符号。折叠与展开表达式factor()函数可以折叠表达式,而expand()函数可以展开表达式,比如表达式:$x^4+xy+8x$,折叠之后应该是$x(x^3+y+8)$。我们来看具体的代码:from sympy import *x,y = symbols(‘x y’)expr=x4+xy+8xf_expr=factor(expr)e_expr=expand(f_expr)print(f_expr)print(e_expr)表达式的折叠与展开,对应的数学知识就是因式分解,相关的数学知识在人教版初二的教程里。用Python学习数学专栏的目的就是要Python与初高中、大学的数学学习结合起来,让数学变得更加简单生动。表达式化简simplify()函数可以对表达式进行化简。有一些表达式看起来会比较复杂,就拿人教版初二上的一道多项式的乘法为例,简化$(2x)^3(-5xy^2)$。from sympy import x,y = symbols(‘x y’)expr=(2x)3(-5xy2)s_expr=simplify(expr)print(s_expr)求解方程组在人教版的数学教材里,我们初一上会接触一元一次方程组,初一下就会接触二元一次方程、三元一次方程组,在初三上会接触到一元二次方程,使用Sympy的solve()函数就能轻松解题。解一元一次方程我们来求解这个一元一次方程组。(题目来源于人教版七年级数学上)$$6 \times x + 6 \times(x-2000)=150000$$from sympy import x = Symbol(‘x’)print(solve(6x + 6*(x-2000)-150000,x))我们需要掌握Python的代码符号和数学符号之间的对应关系,解一元一次方程就非常简单。解二元一次方程组我们来看如何求解二元一次方程组。(题目来自人教版七年级数学下)$$\begin{cases}x+ y =10,\2 \times x+ y=16 \end{cases}$$from sympy import x,y = symbols(‘x y’)print(solve([x + y-10,2x+y-16],[x,y]))很快就可以得出{x: 6, y: 4},也就是$$x=6,y=4$$。解三元一次方程组我们来看如何解三元一次方程组。(题目来自人教版七年级数学下)$$\begin{cases}x+y+z=12,\x+2y+5z=22,\x=4y. \end{cases}$$执行之后,很快可以得出结果{x: 8, y: 2, z: 2},也就是$$x=8,y=2,z=2$$解一元二次方程组比如我们来求解人教版九年级一元二次方程组比较经典的一个题目,$ax^2+bx+c=0$.from sympy import x,y = symbols(‘x y’)a,b,c=symbols(‘a b c’)expr=ax2 + bx + cs_expr=solve( expr, x)print(s_expr)执行之后得出的结果为[(-b + sqrt(-4a*c + b2))/(2a), -(b + sqrt(-4a*c + b2))/(2*a)],我们知道根与系数的关系二次方程会有两个解,这里的格式就是一个列表。转为我们常见的数学公式即为:$$\frac{-b+\sqrt{-4ac+b^2}}{2a} 、-\frac{b+\sqrt{-4ac+b^2}}{2a}$$微积分Calculus微积分是大学高等数学里非常重要的学习内容,比如求极限、导数、微分、不定积分、定积分等都是可以使用Sympy来运算的。求极限Sympy是使用limit(表达式,变量,极限值)函数来求极限的,比如我们要求$\lim \limits_{x \to 0} \frac{sinx(x)}{x}$的值。from sympy import *x, y, z = symbols(‘x y z’)expr = sin(x)/xl_expr=limit(expr, x, 0)print(l_expr)执行后即可得到结果为1。求导可以使用diff(表达式,变量,求导的次数)函数对表达式求导,比如我们要对$sin(x)e^x$进行$x$求导,以及求导两次,代码如下:from sympy import *x,y = symbols(‘x y’)expr=sin(x)*exp(x)diff_expr=diff(expr, x)diff_expr2=diff(expr,x,2)print(diff_expr)print(diff_expr2)求导一次的结果就是exp(x)*sin(x) + exp(x)cos(x),也就是$e^xsin(x)+e^xcos(x)$;求导两次的结果是2exp(x)*cos(x),也就是$$2e^xcosx$$求不定积分Sympy是使用integrate(表达式,变量)来求不定积分的,比如我们要求$\int(e^x\sin{(x)} + e^x\cos{(x)}),dx$from sympy import *x,y = symbols(‘x y’)expr=exp(x)*sin(x) + exp(x)*cos(x)i_expr=integrate(expr,x)print(i_expr)执行之后的结果为:exp(x)*sin(x) 转化之后为:$$e^xsin(x)$$求定积分Sympy同样是使用integrate()函数来做定积分的求解,只是语法不同:integrate(表达式,(变量,下区间,上区间)),我们来看如果求解$\int_{-\infty}^\infty \sin{(x^2)},dx$from sympy import *x,y = symbols(‘x y’)expr=sin(x*2)i_expr=integrate(expr, (x, -oo, oo))print(i_expr)执行之后的结果为sqrt(2)*sqrt(pi)/2,也就是$$\frac{\sqrt{2}\sqrt{\pi}}{2}$$Sympy能够做的也远不止这些,初高中、大学的数学运算题在Sympy极为丰富的功能里不过只是开胃入门小菜而已。 ...

March 27, 2019 · 1 min · jiezi

Python与R、Matlab的对比

作为一枚程序员,想要研究Python编程语言与数学学习(教学)的结合,就不能不了解以及比对一下其他数学学习与应用的解决方案,比如R语言、Matlab等数学软件。经过广泛的搜索了解了一下国外的反馈与趋势之后,最终的结论就是Python确实是未来。Python与R语言的对比Python与R语言在数据分析领域的对比,DataCamp上有一篇引用率非常高的文章,数据分析选择R还是Python,不过这篇文章是2015年写的,我们先大致总结一下文章内容:R主要用于学术与研究,也开始迅速进入企业市场,越是接近统计学、研究、数据科学,你就会越偏爱R,而Python主要用于程序员想进入数据分析领域、掌握统计技能,以及其他开发人员进入数据科学领域。如果你的工作越接近工程环境,你会越偏爱Python。R的社区生态主要是研究员,数据科学家、统计学家和量化研究员,而Python主要是程序员和开发者。R学习门槛比较高,但是当你掌握了基础之后就学起来比较容易,R对程序员来说不难;Python可读性强,入门非常容易,被公认为非常不错的入门编程语言。在2015年前的Tiobe编程语言的排名上Python排名在第4或第5,R排在第17到13。而据2015数据分析领域,用R的研究员占58%,Python占42%,两者都用的占23.45%;在2013年,R转Python的有26%,Python转R的有18%,而新进入数据分析领域的有44%的人选择R,23%的人选择Python.从2015年之前的情况看来,正如作者所说,R和Python在数据分析领域确实平分秋色,难分伯仲,从数据中我们可以看出,虽然Python相比R更流行,在编程方面更有优势,但是在数据科学领域,选择使用R的人更多。但是翻到2018年的文章里看到2016、2017年的数据,情况下发生了逆转。在数据科学领域,2016年有34%的人选择Python,42%的人选择R,而到了2017年41%的人选择Python,36%的人选择R。在2017年的调查统计里数据科学家和工程师最流行的编程语言分别是JavaScript(58.7%,令人惊讶啊,可能与数据可视化有关?)、SQL(58%)、Python(45%),而R(11.2%),Python在商业领域领域比较火,而R在学术和研究领域比较多,所以不那么流行吧。而在最近的Tiobe的排行榜上,与数据科学相关的编程语言Python、R、SQL、Matlab等涨幅都比较大,Python在整个编程语言的流行度也由2014年的2%猛增到2019年8.26%,跃居第3,成为2018年年度语言。Python、R、Scala在数据科学领域的流行包Python与Matlab的对比虽然不是学数学的,但是Matlab的大名可是如雷贯耳,与数学相关专业、相关行业的学生、工程师们基本一定会使用到它。MathWorks公司跟设计公司Adobe、三维软件公司Autodesk一样都是极其硬核的存在,旗下的产品不仅是学习必备,而且是工程(比工作听起来霸气)必备。我个人对Matlab的了解极其有限,Python与Matlab的对比我也只能像一个产品经理去广泛查阅专业意见来权衡利弊。我所得出的结论也只是基于掌握了Python的前提,断不敢用偏颇的立场去亵渎神器。我们来看一下美国相关专业人员对两者的对比,只是粗略而不精准的翻译一下。我是一名工程师,之前长期使用Matlab来处理复杂的数学运算都没有遇到什么大的问题,就在几个月前因为岗位需要学习了Python之后,我才意识到Matlab相比Python是多么的糟糕。之前需要我用Matlab花一整天处理的问题用Python只需数小时,Python的表现、流畅度让我惊讶。而且使用Python我可以做之前用Matlab做的任何事情,而且更优秀。因此我非常建议Matlab使用者转向Python。Python编程语言比Matlab更强大,能够联合非常多的外部工具模块,只需一个文件就可以调用非常多的库、函数、类,语法也更加简单,面向对象开发也更加方便,还能非常方便地调用C、C++、Fortran。Python是免费的,而且可以运行在更多平台上面。 —Stackoverflow某工程师经过调查Matlab与Python的宿命之争在2011年就开始了,而且网上Matlab与Python的对比文章、评论非常之多。Matlab官方在2013年就开始拿Matlab和Python进行对比官方对比最是致命:MATLAB OR Python中文,年代越近,由Matlab全面转向Python的建议就越多,更多人直言Python是未来的编程语言,在Python与Matlab的选择之上,看了非常多的建议,已成一边倒的趋势。有人列出了Python相对于Matlab的8大优势,我只粗略翻译一下这8大优势,详情大家可以去查看原文:Python的代码相比于Matlab更简洁,可读性更强;和其他编程一样,Python都是从0开始计数,而Matlab不是;Python可以更好的支持哈希字典;面向对象开发让Python更简单、更优雅;Python免费且开源;Python一个文件、模块里可以包含非常多的函数;Python支持import声明;Python支持更多图像处理的包和工具集在PyCon 2017年的大会上,多位大佬提出科学家应该全面拥抱Python,在2015年开始Python在NASA的地位就开始遥遥领先IDL、Matlab和Fortran。由于这里我们只讨论Python和Matlab在数学上的对比,至于科学家转型Python的优势的细节,大家可以看DataCamp的雄文。小结其实在写这篇文章之前,我就问过一下包括清华在内的学校以及一些数学专业的学生,Matlab和R还是占主流,但是经过一番调查发现在美国Python在数据科学、数学等方面好像渐成压倒性的优势。这也激励我要把用Python学数学的专栏给写下去。

March 17, 2019 · 1 min · jiezi

MIRtoolbox文档摘要

时间:2019年2月版本:1.7.1(最新版本的1.7.2不知道为啥总是解压失败)IntroductionBasic OperatorsFeature ExtractorsDynamicsRhythm处理音频信号中对于节奏的估计mirfluctuation估计节奏的一种方法是基于变换的频谱图计算(FFT),通过听觉建模,然后是每个频段的频谱估计(Pampalk等,2002)。mirfluctuation就是Pampalk提出的模型。默认参数为23ms/frame,频率80Hz。默认用的是Bark bands,可以使用mirfluctuation(…, ‘Mel’)替换为Mel波段。(下图均为左图是Mel bands,右图)s = mirspectrum(rag,‘Frame’,.023,’s’,80,‘Hz’,‘Power’,‘Terhardt’,‘Mel’,‘Mask’,‘dB’)和s = mirspectrum(rag,‘Frame’,.023,’s’,80,‘Hz’,‘Power’,‘Terhardt’,‘Bark’,‘Mask’,‘dB’)获得未经FFT的结果:f = mirspectrum(s, ‘AlongBands’, ‘Max’, 10, ‘MinRes’, .01,‘Window’, 0, ‘Resonance’, ‘Fluctuation’, ‘NormalLength’)进行FFT(FFT的参数为.01Hz,使用mirfluctuation(…, ‘MinRes’, mr) 修改)。横坐标频率,纵坐标波段。横坐标默认是10Hz( mirfluctuation(…, ‘Max’, m) 修改最大值),纵坐标25-bands(Bark bands应该是20啊?为啥是25),使用Mel bands后纵坐标为40-bands。mirfluctuation(…, ‘Summary’) 获得统计信息:也可以使用mirsum(f)生成,可以应用到所有二维形式结果的统计。修改默认参数:>> mirfluctuation(rag, ‘InnerFrame’, 0.010, 30)mirbeatspectrum节奏频谱,通过计算时滞函数的自相似性,相似矩阵,参考mirsimatrix。Q:为什么横坐标只到4s?#mirevents (previously mironsets)Timbre

February 15, 2019 · 1 min · jiezi

JPEG编码解码(Matlab)

搜索了网上的JPEG的matlab实现方式,发现只有寥寥几个,几乎都是只实现了一半,要么就是哈夫曼编码没有实现,要么就是只算出了哈夫曼的码长计算了一下效率,但是没有实际编码。要么就是太难我看不懂(汗。。。)比如github上几位大神的作品。在此只是简单的按照[1]中的过程实现了一个简单的JPEG,没有任何优化,只求简单。在此简述一下JPEG编码解码的过程中需要关注的点。其中仍有许多简化的部分:(1)只计算了一张灰度图的编码解码,如果要是RGB通道的图需要额外处理RGB到YUV的变化,然后再分别对YUV进行编码,本文所讨论的即主要对其中的Y分量进行了编码。但是这部分的内容网上很容易搜索到。(2)只对固定的图片进行了操作(512512),因为没有添加jpeg文件头,所以很多变量都是我直接指定的。可以添加文件头来增加对多种文件格式的JPEG。(3)存在一个假设,即每一个block在Z字形编排后后边全是0,如果存在一组最后不全是0,最后一位如果是个数的话这个代码可能就不行了,需要特殊处理一下。(这个可能性很小,但是应该依然存在,我猜。。。)问题1:DCT变换离散余弦变换的实现有三种方式[1],第一种是用的矩阵的形式,这个在[4]中也采用的这种方式。[3]中详细的介绍了DCT的原理,非常好评!!!为了方便没有书的同学,在此简述一下方式一:当进行离散余弦变换时,$ Y = AXA^T $ , 其中A即为下边生成的变换矩阵。X是输入样本矩阵,Y是变换后的系数矩阵。进行逆变换时:$ X = A^{T}XA $ 。其中A的公式如下:$ A_{ij} = C_i\cos{\frac{(2j+1)i\pi}{2N}} $其中:$ C_i = \sqrt{\frac1N} \text{(i=0)}, C_i = \sqrt{\frac2N} \text{(i>0)}$在matlab中只需要一行代码就可以实现:T = dctmtx(8),当然我们也可以自己创建自己的变换矩阵: N = 8; T = zeros(N,N); for i = 1:N for j = 1:N T(i, j) = sqrt(2/N) * cos(((2j-1)(i-1)pi)/(2N)); end end T(1,:) = T(1,:) / sqrt(2);dctmtx使用的是矩阵的方法,两种方法结果相似。仅供参考。当然也可以使用matlab提供的dct2()和idct2()函数。这两个个函数的核心其实是第三种方法。得到了变换矩阵,进行DCT操作。[4]中使用了一种非常简便的方式,BY=blkproc(Y,[8 8],‘P1xP2’,T,T’); 进行DCT,可以说非常方便。然后再使用BY2=blkproc(BY,[8 8],‘round(x./P1)’,a);进行量化。这两个函数使用了matlab内置的功能,大大简化了代码。当然出于练习的原因,我还是自己实现了一下这两行代码: quantization=zeros(X,Y); for i = 1:8:X for j = 1:8:Y mask = input_data(i:i+7,j:j+7); DCT = T * double(mask) * T’; quantization(i:i+7,j:j+7) = round(DCT./Luminance_Quantization_Table); end end顺便把量化也做了。在IDCT的时候: data=zeros(X, Y); for i = 1:8:X for j = 1:8:Y mask = decoded_matrix(i:i+7,j:j+7); mask = mask . Luminance_Quantization_Table; data(i:i+7,j:j+7) = T’ * mask * T; end end data = uint8(data);可以看到恢复的时候有一些损失。注意:一定要把数据转换成uint8,才能让imshow()函数生效。问题2:Z字形编排[4]中使用了matlab自带的函数来处理这个问题,变得异常简单。 % order order = [1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 … 41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 … 43 36 29 22 15 8 16 23 30 37 44 51 58 59 52 … 45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 … 62 63 56 64];注意的是order的顺序和Z字形的序号并不相同,这是为了让这个表来适应matlab的特性。使用: y = im2col(quantization, [8 8], ‘distinct’); xb = size(y,2); y = y(order,:);第一个函数是把整个图划分成88=64的若干列,即每一列对应了一个88的块,参数distinct是块与块不重叠。若使用默认sliding参数即为窗口是滑动的。在8*8的块排列的时候是按列排列的,窗口移动的过程中也是竖向移动的。(matlab的默认操作都是以列为基础的,更好的使用列向量的一些特征)注意:在这里最好把这个生成好的Y矩阵保存起来,这样在解码的时候可以和解码后的矩阵进行一下比较,容易发现问题。恢复的时候,需要使用order来生成一个“反Z字形”序列: rev = zeros(1,64); for k = 1:length(order) rev(k) = find(order==k); end X = 512; Y = 512; decoded = decoded(rev,:); decoded_matrix = col2im(decoded, [8 8], [X Y], ‘distinct’);问题3:熵编码(后两个部分几乎都是自己想的,可能效率很低)量化表采用了直接作为变量的形式存了起来。这个在[3]中的github代码里有C语言版的,复制过来稍加改动即可支持matlab。而对于Huffman编码表则是把[2]的码表直接以txt的形式存了起来。然后使用以下语句: [ac_RS, ~, ac_code] = textread(‘AC_Hoffman_coding_table.txt’, ‘%s%s%s’); [dc_RS, ~, dc_code] = textread(‘DC_Hoffman_coding_table.txt’, ‘%s%s%s’);把txt中的内容读进来,读取结果直接是三列,而且Length相等,方便下一步操作。当进行转换的时候直接使用类似一种查表的方式(DC编码方式为例): … if dc==0 % 特殊情况 dc_encode = ‘00’; else % 先对SSSS进行编码 SSSS = floor(log2(abs(dc)))+1; SSSS_index = strcmp(dc_RS ,string(SSSS)); SSSS_encode = cell2mat(dc_code(SSSS_index)); … % 对DIFF进行编码 if dc > 0 DIFF_encode = dec2bin(dc); elseif dc < 0 dc_b = abs(dc); dc_d = bitcmp(uint16(dc_b)); DIFF_encode = dec2bin(dc_d); DIFF_encode = DIFF_encode(end-SSSS+1:end); end注意,在进行小于0的数字进行编码时,采取的应该是反码(书上说的是补码,没看懂),这一点在[3]中有非常详尽的说明。[3]写的是真的好!在使用bitcmp()取反码时,要注意的是取完反码要舍去多余的位,注意dec2bin的第二个参数指的是“at least n bits”,是个大坑。所以还是自己截取一下吧。在AC编码时几乎和DC相同,有几个问题也需要注意,第一个是两种特殊情况的判断。特殊情况1时如果后边全是0了,就可以直接结束了: if mask(j:end)==0 ac_encode = [ac_encode ‘1010’]; break end特殊情况2是超过15个0了也要特殊处理: if mask(j)==0 zero_tot = zero_tot + 1; if zero_tot == 16 ac_encode = [ac_encode ‘11111111001’]; zero_tot = 0; end continue end然后就是要把RRRR和SSSS拼接起来,在进行查找: S = floor(log2(abs(mask(j))))+1; R_S = [dec2hex(zero_tot) ‘/’ dec2hex(S)];问题4:解码解码时先对熵编码进行解码,然后和刚才存好的y进行比较,看看是不是一样。然后再恢复Z字形,再IDCT(这两个前边已经写过了)。熵编码解码的时候没次生成一个64行一列的mask,然后拼接到一起。解码的时候先拿着码串取AC_cod和DC_code中匹配,能匹配成功再进行下一步 index = strcmp(dc_code, tmp); if any(index) SSSS = cell2mat(dc_RS(index)); SSSS = str2double(SSSS); if SSSS == 0 DIFF = ‘0’; else DIFF = input_data(p_end+1:p_end+SSSS); end使用any可以避免一些坑。也要注意0的处理。注意首位是0的时候,要进行反码操作: if DIFF(1) == ‘0’ dc_d = bin2dec(DIFF); dc_b = bitcmp(uint16(dc_d)); dc = -double(mod(dc_b, 2^SSSS)); else dc = bin2dec(DIFF); enddc = -double(mod(dc_b, 2^SSSS)); 这一句如果不加double会出现余数为1但是取负号就成了0的诡异情况。。。难以解释。对AC解码时需要注意的是对“0/0”和“F/0”分别处理一下就好。Reference[1] 《多媒体技术基础(第4版)》 林福宗 清华大学出版社 131-140[2] JPEG 标准推荐的亮度、色度DC、AC Huffman 编码表[3] JPEG算法解密[4] 使用Matlab实现JPEG压缩 (github)[5] Matlab 二进制类型数据相关操作 ...

December 22, 2018 · 2 min · jiezi