1 设计任务
代数系统的性质证明及类别判定
2 设计内容
编写matlab代码,该代码需实现的功能模块包括:
① 验证上述集合及运算是否满足代数系统的封闭性要求,若满足,存储该代数系统,否则输出原因,并提示重新输入;
② 验证该系统是否满足代数系统的9个性质(结合律、交换律、单位元素、零元素、逆元素、分配律、吸收律、上下界、互补律),并输出结果;
③ 根据系统所满足的性质,判定该系统的类别(是否属于“半群、群、循环群、环、域、格、布尔代数”),并输出结果;
3 程序设计
图1 程序流程图
4 数据输入输出
4.1 输入
用户需要输入代数系统的元素集合、运算符个数以及定义在该集合上的运算。
- 元素集合:用户需提供代数系统的基础元素集合,这应该是一个一维数组,例如:[0,1,2,4]。
- 运算符个数:用户应指明在该元素集合上定义的运算符的总数。例如,如果用户打算定义1个运算符,则输入数字1。
- 运算:对于集合上的每个运算,用户需要使用MATLAB的匿名函数[3]语法来定义。MATLAB的匿名函数是通过@(输入参数)这样的格式来创建的。例如,若要定义一个计算输入值平方的匿名函数f,应这样输入:@(a,b)(a+b).^2
4.2 输出
完成以上输入后,程序将按照既定流程图进行代数系统的验证,并执行以下三个模块:
- 代数系统九大性质的验证:深入探究用户定义的运算符是否满足代数系统的九大性质,并记录相应的验证数据和结果。
- 代数系统类别的判断:根据系统的性质,确定其所属的具体类别。
- 结果展示:最后,程序将通过弹窗以直观、优雅的方式展示验证结果和系统类别。
5 测试
将其代入代码中测试:
可以发现系统提示不满足封闭性并要求重新输入,满足我们的预期要求。
接着我们再输入已经证明好的域的例子
定义一个集合为A={0,1,2,.....,10}定义两种运算
已证这两种运算与集合A构成域。将其代入代码中测试:
系统通过弹窗[6]的形式分别输出了运算1,运算2满足的性质最终通过性质判定出该代数系统是一个域,与我们事先证明的结果一致。
6 程序代码
主程序:
clc
clear
%% -----模块一:接收输入,并判断是否满足封闭性要求
%% 请输入集合:[1,2,3]
%% 请输入运算符个数:1
%% 请输入运算运算:@(x,y)abs(x)
fengbi=0;%当输入不满足封闭性时,要求重新输入
while fengbi==0
A=input('请输入集合:');
numyun=input('请输入运算符个数:');
f=cell(1,numyun);
if isempty(A)
fengbi=0;
disp("集合为空,请重新输入")
elseif isempty(numyun)||numyun<=0
fengbi=0;
disp("运算符个数为空,请重新输入")
else
for i=1:numyun
f{i}=input('请输入运算运算:');
fengbi=fengbixing(A,f{i});
if fengbi==0
disp("不满足封闭性请重新输入")
break
end
end
end
end
%% 判断是否为代数系统【1.集合A非空;2.运算符至少1个以上;3.满足封闭性】
disp('******************* 1 ******************** ');%################
disp('*************************************** ');%################
if (~isempty(A))&&(~isempty(f))&&(fengbi==1)
disp("非空");
disp("运算符至少1个以上");
disp("满足封闭性");
disp("这是一个代数系统")
end
%% -----模块二:9个性质的判断
%(1)为判断结果的存储建立空间
jiehe=zeros(1,numyun);
jiaohuan=zeros(1,numyun);
danwei=zeros(1,numyun);
lingyuansu=zeros(1,numyun);
m=size(A,2);
niyuansu=zeros(2,m);
fenpeilv=zeros(1,numyun);
xishoulv=zeros(1,numyun);
shangxiajie=zeros(1,numyun);
buyuansu=zeros(2,m);
%(2)调用子程序,进行性质的判断
disp('****************** 2 ********************* ');%################
disp('*************************************** ');%################
Niyuansu=[ ];
for i=1:numyun
disp(['运算',num2str(i),'情况如下:']);%################
jiehe(i)=jiehexing(A,f{i});%结合律判断
jiaohuan(i)=jiaohuanxing(A,f{i});%交换律判断
danwei(i)=danweixing(A,f{i});%单位元素确定
lingyuansu(i)=lingyuansuxing(A,f{i});%零元素确定
niyuansu=niyuansuxing(A,f{i},danwei(i));%逆元素确定
Niyuansu{1,i}=niyuansu;
end
disp('******************* 3 ******************** ');%################
disp('*************************************** ');%################
if numyun==2
fenpeilv=fenpeilvxing(A,f{1},f{2});%分配律判断
xishoulv=xishoulvxing(A,f{1},f{2});%吸收律判断
shangxiajie=shangxiajiexing(A,f{1},f{2});%上下界判断
buyuansu=buyuansuxing(A,f{1},f{2},danwei);%补元素确定
end
%% -----模块三:弹窗输出
disp('******************* 4 ******************** '); %################
disp('*************************************** '); %################
k = yujuxingzhi(jiehe, jiaohuan, danwei, lingyuansu, Niyuansu, numyun);
kk = yujuxingzhi2(fenpeilv, xishoulv, shangxiajie, buyuansu);
for i = 1:numyun
disp(['运算', num2str(i), '情况如下:']); %################
for j = 1:size(k, 1)-1
l{i,j}=k{j, i};
end
r{i,1}=k{j+1 ,i};
msgbox(['运算', num2str(i),l{i,:},r{i,1}]);
end
if numyun==2
disp(['运算', num2str(1),num2str(2), '情况如下:']); %################
for j = 1:size(kk, 1)-1
x{i,j}=kk{j, i};
end
y{i,1}=kk{j+1 ,i};
% msgbox([kk{j, 2},'运算', num2str(1),num2str(2)]);
msgbox(['运算', num2str(1),num2str(2),x{i,:},y{i,1}]);
end
Leixing=Leibie(numyun, fengbi, jiehe, jiaohuan, danwei, lingyuansu, Niyuansu, fenpeilv, xishoulv, shangxiajie, buyuansu, A,f);
disp(['运算', num2str(1),num2str(2), '情况如下:']); %################
if isempty(Leixing)
Leixing{1,1}="该代数系统不是半群、群、环、域、格、布尔代数中的任何一种";
end
msgbox(Leixing);
分程序见上传资料(数量有点小多就不逐一上传了)