用MATLAB实现群论在苯环的同分异构体计数上的应用

下面就以苯环上有三个不同的取代基的同分异构体数目为例:

clear;clc;
%苯环的小圈
aa = 0; 
bb = 0;
rr = 0.5;
theta = 0:0.01:2*pi;
xx = aa+rr*cos(theta);
yy = bb+rr*sin(theta);
%苯环的六边形和触须
d1 = [2,0];d2 = [1,-sqrt(3)];d3 = [-1,-sqrt(3)];
d4 = [-2,0];d5 = [-1,sqrt(3)];d6 = [1,sqrt(3)];
dd1 = 1.3*d1;dd2 = 1.3*d2;dd3 = 1.3*d3;
dd4 = 1.3*d4;dd5 = 1.3*d5;dd6 = 1.3*d6;
ddd1 = 1.6*d1;ddd2 = 1.6*d2;ddd3 = 1.6*d3;
ddd4 = 2*d4;ddd5 = 1.6*d5;ddd6 = 1.6*d6;
d = {d1,d2,d3,d4,d5,d6};
dd = {dd1,dd2,dd3,dd4,dd5,dd6};
ddd = {ddd1,ddd2,ddd3,ddd4,ddd5,ddd6};
%翻转的种类
maker = [2,1,6,5,4,3;
         6,5,4,3,2,1;
         4,3,2,1,6,5;
         1,6,5,4,3,2;
         5,4,3,2,1,6;
         3,2,1,6,5,4;];
%取代基
order = {'H','H','H','CH3','COOH','NO2'};
my_perms = perms(order); %order的所有排列
r = size(my_perms,1); %行数
N = r;
h = waitbar(0,'processing...');
for i = 1:r-1
    flag = 0; %用来记录是否有相同
    for j = i+1:r
        %相等
        if [my_perms{i,:}]==[my_perms{j,:}]
            flag = 1;
        end
        %翻转
        for p = 1:size(maker,1)
            if [my_perms{i,:}]==[my_perms{j,maker(p,1)},my_perms{j,maker(p,2)},my_perms{j,maker(p,3)},my_perms{j,maker(p,4)},my_perms{j,maker(p,5)},my_perms{j,maker(p,6)}]
                flag = 1;
            end
        end
        %旋转
        for k = 1:5
            a = [rem(k+1,7),rem(k+2,7),rem(k+3,7),rem(k+4,7),rem(k+5,7),rem(k+6,7)];
            for n = 1:6
                if a(n)==0
                    m = 1;
                    break;
                end
            end
            nn = 1;
            if (n~=6)||(m==1)
                for jj = n:6
                    a(jj) = nn;
                    nn = nn+1;
                end
            end
            if [my_perms{i,:}]==[my_perms{j,a(1)},my_perms{j,a(2)},my_perms{j,a(3)},my_perms{j,a(4)},my_perms{j,a(5)},my_perms{j,a(6)}]
                flag = 1;
            end
        end
    end
    %绘图
    if flag==0
        clf;
        circle = plot(xx,yy,'LineWidth',1.5,'Color','k');
        set(gca,'xtick',[],'ytick',[]);
        axis([-6,6,-6,6]);
        hold on
        box on
        for c = 1:6
            if (c==4)
                text(ddd{c}(1),ddd{c}(2),fliplr(my_perms{i,c}),'FontSize',12,'FontWeight','bold');
               
            else
                text(ddd{c}(1),ddd{c}(2),my_perms{i,c},'FontSize',12,'FontWeight','bold');
            end
            if c~=6
                plot([d{c}(1),d{c+1}(1)],[d{c}(2),d{c+1}(2)],'LineWidth',1.5,'Color','k');
            else
                plot([d{6}(1),d{1}(1)],[d{6}(2),d{1}(2)],'LineWidth',1.5,'Color','k');
            end
            plot([d{c}(1),dd{c}(1)],[d{c}(2),dd{c}(2)],'LineWidth',1.5,'Color','k');
        end
    pause(2)
    end
    %减去重复
    N = N-flag;
    waitbar(i/(size(my_perms,1)-1),h,['processing...',num2str(100*i/(size(my_perms,1)-1)),'%']);
end
disp(['同分异构体的数量有:',num2str(N),'个']);

运行结果如下图所示:

上述代码有较强的泛化能力,只需改变变量order就可以实行对各种取代基的计数。接着将苯环上的取代基全不同,即order = {'H','COOH','CH3','Br','Cl','NO2'}得出同分异构体的数量有60种:

从此妈妈再也不用担心我的苯环同分异构体不会数的问题了 。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值