导读:还记得精品干货 《 matlab科研绘图模板,拿走不谢》这篇文章吗?已经突破200 人领取,阅读量突破了3600 次,预计还会持续走高。今天我们推荐matlab爱好者创作者之一过冷水老师,他也是仿真秀平台最新加入的Matlab专栏作者,正在仿真秀平台分享这些年他积累matlab知识和经验,希望对大家有些许帮助。
以下是正文
在仿真秀平台中从事有限元分析的用户比较多,可是过冷水不懂Ansys、Altair、Dassault、MSC、SIEMENS、PTC、ESI、AUTODESK等,但稍懂matlab啊!可以强强联合,是不是啊!
应仿真秀平台的邀请,笔者使用matlab写一些简单的脚本解决有限元分析过程中遇到问题,还有Matlab科研绘图实用技能(matlab图像标记&四周添加坐标轴)。以及用matlab实现复杂累计求和的展开程序。
熟悉Ansys的人都知道,Ansys有GUI和命令流俩个操作模式,优缺点就不多说了。前处理就是建模,点线面体几何拓扑。如果有几千个坐标点(XYZ),成点很麻烦,线面体更麻烦。简单,可回退,可传播分享的一种方式就是利用脚本批量写入命令流到文本文件(Txt-dat-sca-csv...)
1、脚本批量写入命令流文本文件
%三维数据到ANSYS [filename,pathname,filterindex]=uigetfile({'*.csv';'*.xlsx';'*.mat'},'选择数据文件'); str=[pathnamefilename]; iffilename==0%取消 return; end iffilterindex==2 c_temp=importdata(str); c_close=c_temp.Sheet1; else c_temp=importdata(str); c_close=c_temp; end [hang,lie]=size(c_close); iflie==3 mingzinn=char(filename); ll=strfind(mingzinn,'.'); ll0=mingzinn(1:ll-1); nametxt=[ll0,'2ANSYS','.dat'];%扩展名可改 fp=fopen(nametxt,'a'); str111='k,'; str222=','; str333=''; str444='LP1=_return'; %str555='L,LP1,LP2'; %str666='LP1=LP2'; %str777='LP2=_return'; fori=1:1:hang ifi==1 fprintf(fp,'%s\r\n','/prep7'); fprintf(fp,'%s\r\n','CSYS,0'); str1=[str111,num2str(i),str222,num2str(c_close(1,1)),str222,num2str(c_close(1,2)),str222,num2str(c_close(1,3))]; fprintf(fp,'%s\r\n',str1); else str2=[str111,num2str(i),str222,num2str(c_close(i,1)),str222,num2str(c_close(i,2)),str222,num2str(c_close(i,3))]; fprintf(fp,'%s\r\n',str2); end end fprintf(fp,'%s\r\n','!FilegenerationusingMatlab.m'); fclose(fp); sound(sin(2*pi*25*(1:4000)/100)); else msgbox('数字矩阵必须为x*3形态'); end
[filename,pathname,filterindex]=uigetfile({'*.sca';'*.csv';'*.xlsx';'*.mat'},'选择数据文件'); str=[pathnamefilename]; iffilename==0%取消 return; end iffilterindex==3 c_temp=importdata(str); c_close=c_temp.Sheet1; elseiffilterindex==1 c_temp=importdata(str); c_close=c_temp.data; c_close=c_close(:,2:4); elseiffilterindex==2 c_temp=importdata(str); c_close=c_temp; elseiffilterindex==4 c_temp=importdata(str); c_close=c_temp; end [hang,lie]=size(c_close); iflie==3 mingzinn=char(filename); ll=strfind(mingzinn,'.'); ll0=mingzinn(1:ll-1); nametxt=[ll0,'-Ansys','.dat'];%扩展名可改 fp=fopen(nametxt,'a'); str111='K,,'; str222=','; str333=''; str444='LP1=_return'; str555='L,LP1,LP2'; str666='LP1=LP2'; str777='LP2=_return'; fori=1:1:hang ifi==1 fprintf(fp,'%s\r\n','/prep7'); str1=[str111,num2str(c_close(1,1)),str222,num2str(c_close(1,2)),str222,num2str(c_close(1,3)),str333]; fprintf(fp,'%s\r\n',str1); fprintf(fp,'%s\r\n',str444); else str2=[str111,num2str(c_close(i,1)),str222,num2str(c_close(i,2)),str222,num2str(c_close(i,3)),str333]; fprintf(fp,'%s\r\n',str2); fprintf(fp,'%s\r\n',str777); fprintf(fp,'%s\r\n',str555); fprintf(fp,'%s\r\n',str666); end end fprintf(fp,'%s\r\n','!FilegenerationusingMatlab.m'); fclose(fp); sound(sin(2*pi*25*(1:4000)/100)); else msgbox('数字矩阵必须为x*3形态(不算*.sca)'); end
成面与体,看自己实际需求,也可直接在ansys里写命令流。
3、Ansys求解结果输出
Ansys求解后的结果该如何导出呢,举个栗子,比如各节点的x方向位移(需要把Ansys里对应的List的文本**出来,比如到csv),源码如下:
[hang,lie]=size(a88); ping=[]; fori=1:1:hang jiancha=a88(i,1); kankan=str2num(jiancha); ifisempty(kankan)==1 else ping=[ping;kankan]; end h=waitbar(i/hang); end delete(h); msgbox('OK');
这样得到的就是数据文件而不是字符串,且没有空白,没有注释。
对于Ansys,懂的看它的Log日志文件很重要,但是此文件里有很多的无效命令,就是前面加了!,感叹号是注释的意思,如何把这些非实质性操作清空呢,详情请见代码:
[h,l]=size(log); xin=[]; nametxt=['log1','-Ansys','.dat']; fp=fopen(nametxt,'a'); forp=1:1:h jiancha=log(p,1); l8=strlength(jiancha); ifl8>1 weizhi=strfind(jiancha,'!'); [k1,k2]=size(weizhi); ifk1>0&&weizhi(1,1)==1 else xin=[xin;jiancha]; fprintf(fp,'%s\r\n',jiancha); end else end jdt=waitbar(p/h); end fprintf(fp,'%s\r\n','!FileidealizationusingMatlab.m');%写下来源嘿嘿 delete(jdt); fclose(fp); sound(sin(2*pi*25*(1:4000)/100));
这样就可以生成log文件了。用ansys的朋友自然懂的过冷水给大家分享的干货。有兴趣的可以留言相互讨论交流,增进大家学习技能。
1、如何四周添加坐标轴?
上个月,我听了仿真秀平台讲师算法工匠前辈的 《2020Matlab工程师线上训练营》免费直播课(欢迎回看哦),是关于绘图方面的知识,算法工匠蔡老师的讲课方式对于基础小白还是很友好的,过冷水在日常工作中也经常用Matlab绘图,有时候会绘制这样的图。
但是 ,绘制这样的图还是有点难度的,有时候我们需要多掌握一点绘图方面的技巧,以满足日常实际需求。过冷水也和大家讲讲这样的图应该怎么画。这幅图是过冷水本科期间老师让画的一幅图,具体含义就不给大家讲了。
这幅图的不同之处在于:四个方向都有坐标,这在平常绘图中是很少见的。
上下坐标、左右坐标的坐标轴方向都是相反的,大小变化形式不同。
首先,解决该问题的诀窍在于坐标轴的叠加,这幅图可以理解为三个坐标轴叠加调整得到。
坐标轴叠加的命令;
hl=gca;%获得当前轴的句柄 h2=axes('position',get(hl,'position'));
问题二我们需要解决的是如何把三个原点为左下方的坐标轴修改成如图所示的四方都有坐标轴的形式。
可用以下几个命令实现
axis('ij',[])%坐标轴原点设为左上方; set(axis,'yaxislocation','right/left');%将Y坐标轴设置在右边/左边; set(axis,'xaxislocation','botttom');%将x坐标轴设置在右边/左边; set(axis,'x(y)dir','reverse');%将x/y坐标标注反转.
上图涉及到了核心绘图命令已经讲解完毕,完整绘图代码》》》matlab图像标记&四周添加坐标轴
2、如何在Matlab对图像特殊标记
有时候绘图的时候图像要求我们做特殊标记,基本上常见的教科书都会把命令摆出出来,对于初学者很抽象不知道具体该怎么用,这个时候你需要一段代码来实现你想要实现的要求。比如说:
这幅图也是过冷水在学习过程中遇到的一幅图,MATLAB入门教程中是不会讲图示中的箭头绘制、交点标记、线条数学公式化标记的,恰好这些都有较强的实用行,就和大家分享一下。
第一、箭头绘制我们可以使用命令
annotation(figure,'arrow',[x_begin,x_end],[y_begin,y_end]);
第二、线条/文本公式化标记的命令为
text('FontSize',16,'FontName','TimesNewRoman','Interpreter','latex','String','$$y_1=100(\frac{x}{200})^3\int_{0}^{\frac{200}{x}}\frac{t^4e^t}{(e^t-1)^2}dt$$'); legend(axes1,'$y_1=100(\frac{x}{200})^3\int_{0}^{\frac{200}{x}}\frac{t^4e^t}{(e^t-1)^2}dt$'); set(legend,'Interpreter','latex');
以上两个命令字符串书写部分有微小的差别,读者自行观察。图例需要通过设置才能显示特殊形式,而文本则不需要,这一点需要注意。
在matlab中要表现较为复杂的符号或者公式需要用特有格式,常见的格式有如下:
第三、给大家讲有特色的自动点标记的技巧,在实际绘图我们经常更直观的展示特殊点的信息需要标记,MATLAB中是没有自动标记点的命令可以调用的,命令需自编。
[m_one,n_one]=find(abs(y1-y2)==min(abs(y1-y2)));%特殊点的坐标识别,本文取交点的坐标; m=T(m_one,n_one);n=y1(m_one,n_one);%读取交点对应的X,Y数值 str=['min('num2str(m)','num2str(n)')'];%对数值进行符号化; text(m,n,str);%文本标记
过冷水想和大家分享的绘图小技巧就这么多,若是觉得过冷水和大家分享的知识有用,请多多推广。
Matlab绘图小技巧,过冷水就分享这么多,如果大家觉得我分享的知识有用,欢迎在文末点赞、好评和分享,以上资料请点击右侧下载》》》matlab图像标记&四周添加坐标轴(目前建议在电脑端下载哦)
最后,我再送一波福利吧!我们在日常模型应用中经常会遇到如图所示的,复杂公式(如下图),要想分析该公式需要对数学要求很高,过冷水也是在实际过程中遇到了这个问题,所以自己编程做了公式的累计求和展开程序,有需要学习的可以下载附件源程序点击右侧下载》》》用matlab实现复杂累计求和的展开(程序分享)
作者:过冷水 仿真专栏作者
声明:原创文章,首发仿真秀APP,部分图片源自网络,如有不当请联系我们,欢迎分享,禁止私自转载