Lumerical练习1-建模练习

目录

题目1:画一个十字叉+四个扇形

建模逻辑

所需要的变量

脚本编写

生成结果

附完整代码

题目2:一组正六边形

建模逻辑

所需要的变量

脚本编写

生成结果

附完整代码


程序:zhangjiali1201/Lumerical_demo (github.com)

本文程序为exercise1_model_cross和exercise2_model_hex

题目1:画一个十字叉+四个扇形

建模逻辑

中心的十字叉由交叠的两个矩形组成,使用两次addrect即可。周围的四个扇形可以用addring命令,内径为0,外径为R。

所需要的变量

扇形半径R,十字叉宽度w,十字叉与扇形的间隙gap,整个模型的厚度H,以上参数均为Length类型。

材料为了便于区分,十字叉和扇形选择不同的材料,十字叉为硅,扇形为金。

脚本编写

开始前先删除所有模型。

deleteall;

然后建立两个矩形,构成十字叉。

addrect;
set('name','cross1');
set('x',0);
set('y',0);
set('z span',H);
set('x span',2*R+2*gap+w);
set('y span',w);
set('material',silicon);

addrect;
set('name','cross2');
set('x',0);
set('y',0);
set('z span',H);
set('x span',w);
set('y span',2*R+2*gap+w);
set('material',silicon);

然后用for循环构建四个扇形。这里扇形的起止角度比较简单,可以直接用90度的倍数,也可以给角度全部列到矩阵里。

#create sector
V=[gap+w/2,gap+w/2;
   -(gap+w/2),gap+w/2; 
   -(gap+w/2),-(gap+w/2);
   gap+w/2,-(gap+w/2)];
#the=[0,90,180,270,360];
for(i=1:4)
{
    addring;
    set('name','sector'+num2str(i));
    set('x',V(i,1));
    set('y',V(i,2));
    set('z span',H);
#   set('theta start',the(i));
#   set('theta stop',the(i+1));
    set('theta start',(90*(i-1)));
    set('theta stop',(90*i));
    set('inner radius',0);
    set('outer radius',R);
    set('material',gold);
    }

生成结果

附完整代码

#################
#edited by jializhang, 20210418

deleteall;

#create the cross
addrect;
set('name','cross1');
set('x',0);
set('y',0);
set('z span',H);
set('x span',2*R+2*gap+w);
set('y span',w);
set('material',silicon);

addrect;
set('name','cross2');
set('x',0);
set('y',0);
set('z span',H);
set('x span',w);
set('y span',2*R+2*gap+w);
set('material',silicon);

#create sector
V=[gap+w/2,gap+w/2;
   -(gap+w/2),gap+w/2; 
   -(gap+w/2),-(gap+w/2);
   gap+w/2,-(gap+w/2)];
#the=[0,90,180,270,360];
for(i=1:4)
{
    addring;
    set('name','sector'+num2str(i));
    set('x',V(i,1));
    set('y',V(i,2));
    set('z span',H);
#   set('theta start',the(i));
#   set('theta stop',the(i+1));
    set('theta start',(90*(i-1)));
    set('theta stop',(90*i));
    set('inner radius',0);
    set('outer radius',R);
    set('material',gold);
    }

题目2:一组正六边形

建模逻辑

首先构建最中心的六边形,然后用循环构建周围的六个六边形。

lumerical中的addpoly指令是依次连接多边形的端点来构建多边形。例如下图,就会依次连接这五个点来构建一个五边形。

那对于中间的六边形而言,只要列出六个端点的坐标就可以绘制出来。

周围的六个六边形的中心可以通过一个循环列出来,如果将最右侧的六边形记为1,逆时针排序,外侧多边形和中心多边形的连线与x轴的夹角记为theta,那么theta角依次为0°,60°,120°,180°,240°,300°,360°。外侧多边形和中心多边形的连线的长度恒为2*R*cos(pi/3)+gap,所以外围多边形的中心点可以求出。再根据端点绘制出六边形就可以完成整个建模。

所需要的变量

六边形半径R,整个模型的厚度H,六边形之间的间隙gap。

材料选择玻璃。

脚本编写

首先尝试根据六边形端点坐标生成中心的六边形。

deleteall;

#create the hexagon in the center

theta=pi/6;
vtx=[R*cos(theta),R*sin(theta);
    0,R;
    -R*cos(theta),R*sin(theta);
    -R*cos(theta),-R*sin(theta);
    0,-R;
    R*cos(theta),-R*sin(theta)];
addpoly;
set('name','hexagon');
set('vertices',vtx);
set('z span',H);
set('material',glass);

可以看到成功生成了一个六边形,但这样的写法不具有普遍性,可以将其简化。

deleteall;

vtx=zeros(6,2);
for(i=1:6)
{
    vtx(i,1)=R*cos(pi/6+(i-1)*pi/3);
    vtx(i,2)=R*sin(pi/6+(i-1)*pi/3);
}
addpoly;
set('name','hexagon');
set('vertices',vtx);
set('z span',H);
set('material',glass);

加下来可以构建周围的六个六边形。六边形的中心点坐标可以通过一个循环得出,而端点的坐标计算与中心六边形的计算方法相同,只要在坐标上加上中心点的x,y值变化即可。

for(i=0:6)
{    
    Nx=(2*R*cos(pi/6)+gap)*cos(0+(i-1)*pi/3);
    Ny=(2*R*cos(pi/6)+gap)*sin(0+(i-1)*pi/3);
  
    vtx=zeros(6,2);
    for(j=1:6)
    {
        vtx(j,1)=R*cos(pi/6+(j-1)*pi/3)+Nx;
        vtx(j,2)=R*sin(pi/6+(j-1)*pi/3)+Ny;
    }
    
    addpoly;
    set('name','hexagon'+num2str(i));
    set('vertices',vtx);
    set('z span',H);
    set('material',glass);
}

可以看出,绘制中心六边形的代码和绘制周围六边形的代码重合度非常高,其不同点就在于周围六边形的端点坐标加上了中心点的平移,因此可以将他们整合到一起。设定一个判断条件,在绘制中心六边形的时候将中心点的平移置为0即可满足要求。

deleteall;

#create the hexagon
for(i=0:6)
{
    if (i==0)
    {   
        Nx=0;
        Ny=0;
    }
    else
    {
        Nx=(2*R*cos(pi/6)+gap)*cos(0+(i-1)*pi/3);
        Ny=(2*R*cos(pi/6)+gap)*sin(0+(i-1)*pi/3);
    }
    
    vtx=zeros(6,2);
    for(j=1:6)
    {
        vtx(j,1)=R*cos(pi/6+(j-1)*pi/3)+Nx;
        vtx(j,2)=R*sin(pi/6+(j-1)*pi/3)+Ny;
    }
    
    addpoly;
    set('name','hexagon'+num2str(i));
    set('vertices',vtx);
    set('z span',H);
    set('material',glass);
}

生成结果

附完整代码

########################################
#modeling exercise
#draw a couple of hexagons
#edited by jializhang,20210417

deleteall; 

#create the hexagon
for(i=0:6)
{
    if (i==0)
    {   
        Nx=0;
        Ny=0;
    }
    else
    {
        Nx=(2*R*cos(pi/6)+gap)*cos((i-1)*pi/3);
        Ny=(2*R*cos(pi/6)+gap)*sin((i-1)*pi/3);
    }
    
    vtx=zeros(6,2);
    for(j=1:6)
    {
        vtx(j,1)=R*cos(pi/6+(j-1)*pi/3)+Nx;
        vtx(j,2)=R*sin(pi/6+(j-1)*pi/3)+Ny;
    }
    
    addpoly;
    set('name','hexagon'+num2str(i));
    set('vertices',vtx);
    set('z span',H);
    set('material',glass);
}

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
MASH1-1-1建模Simulink是指在Simulink软件平台上,使用MASH1-1-1模型进行系统建模和仿真。MASH1-1-1是一种系统模型,用于描述具有多个阶段的微积分信号转换器(MASH)。 首先,在Simulink环境中创建一个新的模型,并添加所需的信号处理组件。然后,将MASH1-1-1模型作为信号转换器组件的一部分进行添加。 MASH1-1-1模型的核心是通过级联多个更低阶的模块。每个模块都有一个符号调节器和一个量化器。这些模块可用于对输入信号进行转换和量化,以产生输出信号。 在Simulink中,我们将每个模块作为单独的子系统添加到MASH1-1-1模型中。将符号调节器和量化器组件连接起来,以建立级联结构。确保每个模块的输出与下一个模块的输入相连接。 在建模过程中,我们还可以设置每个模块的参数和属性,例如位宽、重要性等。这些参数将影响系统的性能和特性。 完成模型的连接和参数设置后,我们可以通过添加输入信号源和输出信号记录器来定义输入和输出。输入信号可以是连续时间信号或离散时间信号,具体取决于信号的类型和模型的要求。 最后,通过运行Simulink模型,我们可以进行系统仿真,以观察信号转换和量化的效果。仿真结果将显示系统的输出信号,并可以通过分析结果来评估系统的性能和准确性。 总之,通过在Simulink中建模MASH1-1-1模型,我们可以实现对复杂系统的信号转换和量化功能进行仿真和分析。这为我们理解和优化系统提供了一个强大的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangjiali12011

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值