一、规则组织数学模型的建立
规则组织满足两个不变:1,组织点运动规律不变、2,飞数不变的单系统组织
即:若知道组织点运动规律和飞数即可确定唯一一个组织。
3上2下,组织循环数为3+2=5,经纱循环数=纬纱循环数=5,故意匠格的大小为5×5。
其对应的组织图为:
很容易理解:从下向上、从左向右
第一列:三个黑两个白,(例如:黑为经组织点,白为纬组织点)
第二列:由于飞数是2,这里需要将每个位置都向上移动两个单位
第三列:以此类推,超出的组织图大小的组织点,从最底下向上依次补齐即可
为了让计算机能够识别,这时候需要引入二维数组进行标识,规定:在二维数组中,值为1时表示经组织点,值为0时表示纬组织点。
矩阵中的列数=经纱循环数,行数=纬纱循环数
这里使用N1代表行数即纬纱循环数,N2表示列数即经纱循环数。
通过二维数组:a[N1][N2]即可唯一表示一个单系统组织;即矩阵和组织图之间时一一对应的关系。
经纱循环数即在一个组织中包含经纱的根数;同理,纬纱循环数即在一个组织中包含纬纱的根数。
对于组织而言,只有两种形式:1,经纱在纬纱上,称之为经组织点、1,纬纱在经纱上,称之为纬组织点
二、矩阵的第一列赋值
组织的运动规律使用一个分式进行表示。
组织的一般形式
:
c1上d1下,c2上d2下,c3上d3下…以此类推
ci表示连续的经组织点,di表示连续的纬组织点
分析:当得到组织图时,如何定义出对应的二维矩阵
1,首先,组织图都是从下往上,从左往右定义的,即左下角为起始位置,然后向上。对于一个规则组织来说,行数和列数是相同的,经纱循环数=纬纱循环数。
2,当拿到组织的一般形式时,需要先确定二维矩阵的大小,即行数和列数;只需要将所有的分子和分母都加到一块即可得到二维矩阵的大小。
例如:3上2下2上1下,飞数为1的组织一般形式
之所以是8×8的二维矩阵,是因为3+2+2+1=8
故可以求出其经纬纱循环数N2和N1,即
3,确定二维矩阵的大小后,开始求其中的每一个元素的值
想要画出组织图所对应的二维矩阵,需要先将第一列的值
确定出来。
若取组织图一般表达式,该分式的分子赋值为1,分母赋值为0
由于组织图是由下向上进行表示的,组织中的组织点与二维数组中点的坐标刚好相反。
第一列的元素所对应的组织图的位置为:N1-i+1
例如:N1=5
组织的一般表达式为:
即,3上2下,上赋值为1,下赋值为0
3上,3个1 是先赋值给a5、a4、a3;2下,2个0再赋值给a2、a1
即对应的次序为N1-i+1
组织一般表达式(i代表纬纱,次序从下往上) | 运算 | 二维矩阵具体点 |
---|---|---|
i=1(第一根纬纱,最下面) | 5-1+1=5 | a5 |
i=2 | 5-2+1=4 | a4 |
i=3 | 5-3+1=3 | a3 |
i=4 | 5-4+1=2 | a2 |
i=5 | 5-5+1=1 | a1 |
4,确定表达式通式从而确定第一列所对应的矩阵值
其中,x和y仅为两个做判断的任意变量,初始值均为0。当取分子时,x+1,y不变;取分母时,y+1,x不变
。
例如:
(经组织循环数=纬组织循环数)N1=N2=3+2+2+1=8 | c1=3 | d1=2 | c2=2 | d2=1 | 初始值:x=y=0 | 运算 | 二维数组对应值 |
---|---|---|---|---|---|---|---|
i=1(第一根纬纱) | c1=3(分子c1=3取下来,需要依次赋3个1) | 因为c1是分子,x=x+1=1,y=y=0 | N1-i+1=8 | 因为c1是分子,故a8=1 | |||
i=2 | c1=c1-1=2 | 因为没有取新的c和新的d,故x和y均保持不变,x=x=1,y=y=0 | N1-i+1=8-2+1 | 因为c1是分子,故a7=1 | |||
i=3 | c1=c1-1=1 | 因为没有取新的c和新的d,故x和y均保持不变,x=x=1,y=y=0 | N1-i+1=8-2+1 | 因为c1是分子,故a6=1 | |||
i=4 | c1=c1-1=1-1=0,因为c1=0,故需要取下一个值,即d1=2 | d1=2 | 因为d1是分母,x=x=1,y=y+1=0+1=1 | N1-i+1=8-4+1 | 因为d1是分母,故a5=0 | ||
i=5 | d1=d1-1=2-1=1 | 因为没有取新的c和新的d,故x和y均保持不变,x=x=1,y=y=1 | N1-i+1=8-5+1 | 因为d1是分母,故a4=0 | |||
i=6 | d1=d1-1=1-1=0,因为d1=0,故需要取下一个值,即c2=2 | c2=2 | 因为c2是分子,x=x+1=1+1=2,y=y=1 | N1-i+1=8-6+1 | 因为c2是分子,故a3=1 | ||
i=7 | c2=c2-1=2-1=1 | 因为没有取新的c和新的d,故x和y均保持不变,x=x=2,y=y=1 | N1-i+1=8-7+1 | 因为c2是分子,故a2=1 | |||
i=8 | c2=c2-1=1-1=0,因为c2=0,故需要取下一个值,即d2=1 | d2=1 | 因为d2是分母,x=x=2,y=y+1=1+1=2 | N1-i+1=8-8+1 | 因为d2是分母,故a1=0 |
5,确定第二列矩阵值
第一列矩阵值确定之后,第二列的矩阵值主要取决于飞数,飞数为1,上移1格、飞数为-1,下移1格。
其中飞数实际上可以取任何整数,为了避免飞数过大造成不必要的影响,这里人为规定飞数f的取值范围为:
例如:若N1=3时,飞数f的取值为+1、-1、+2、-2;以2上1下
为例。
( a )飞数f=+1
( b )飞数f=+2
( c )飞数f=-1
( d )飞数f=-2
不难看出,f=+1和f=-2、f=+2和f=-1所对应的组织图是一样的。
+1 = 3 + (-2)、+2 = 3 + (-1)
故可以得出结论:
其中f‘为负飞数,f为正飞数;通过这个表达式即可将所有的负飞数均转化为正数
,方便后续的处理。
6,确定第二列矩阵值与第一列矩阵值的关系式
例如:,
a[1][1] = 0 | a[1][2]=a[1+2][2-1]=a[3][1]=1 | a[1][3]=a[1+2][3-1]=a[3][2]=1 |
a[2][1] = 1 | a[2][2]=a[2+2-3][2-1]=a[1][1]=0 | a[2][3]=a[2+2-3][3-1]=a[1][2]=1 |
a[3][1] = 1 | a[3][2]=a[3+2-3][2-1]=a[2][1]=1 | a[3][3]=a[3+2-3][3-1]=a[2][2]=0 |
由规律可得:,其中i=1,2,3,…,m;j=1,2,3…,n;规则组织中m=n。
7,举例推理验证:
解析:拿到这个分式的时候,先写出组织的一般形式,可得:m=n=1、c1=2、d1=1、f=+2(右斜飞数为正,左斜飞数为负)
()
首先,求解第一列元素值:a[3][1]=1,a[2][1]=1,a[1][1]=0
,即
a[3][2]=a[3+2-3][2-1]=a[2][1]=1、a[2][2]=a[2+2-3][2-1]=a[1][1]=0、a[1][2]=a[1+2][2-1]=a[3][1]=1
a[3][3]=a[3+2-3][3-1]=a[2][2]=0、a[2][3]=a[2+2-3][3-1]=a[1][2]=1、a[1][3]=a[1+2][3-1]=a[3][2]=1
三、知道组织点对应的矩阵值关系之后,开始编写程序
1,规则组织的程序流程图如下:
2,代码实现:
#include <iostream>
#include<stdio.h>
using namespace std;int main()
{int i,j,N1,N2,f,m;//因为规则组织是方阵,m=n,故这里只定义m即可int c[10],d[10],a[100][100];//c数组主要存储c1、c2、c3...,d数组主要存储d1、d2、d3...printf("please input m:");scanf("%d",&m);//确定矩阵的大小for(i=0;i<m;i++)//依次输入ci和di的值,其中i∈[0,m),也就总共m个,数组下标从0开始的而已。{printf("please input C[%d]:",i+1);scanf("%d",&c[i]);printf("please input D[%d]:",i+1);scanf("%d",&d[i]);}N1=0;//纬纱循环数初始化,之后需要累加for(i=0;i<=m-1;i++)//确定纬组织循环数,也就是Σ(ci+di),分子分母之和即可{N1=N1+c[i]+d[i];//确定出纬纱循环数N1}N2=N1;//因为是规则组织故其对应的经纬组织循环数相等printf("please input f:");//输入飞数scanf("%d",&f);if(f<0)f=N1+f;//若飞数为负数,通过公式转换成正数/*
对第1列进行赋值
*/i=1;//先对第一列赋值,从第一列的第一行开始for(j=0;j<m;j++){while(c[j]>0){a[N1-i+1][1]=1;//因为是分子,所有值都赋值为1c[j]--;//用一次减一次i++;//下一行进行赋值}while(d[j]>0){a[N1-i+1][1]=0;//因为是分母,所有值都赋值为0d[j]--;i++;}}/*
对2到N1列 进行赋值
*/for(j=2;j<=N2;j++){for(i=1;i<=N1;i++){if((i+f)>N1) a[i][j] = a[i+f-N1][j-1];else a[i][j]=a[i+f][j-1];}}/*
输出二维数组a[i][j]
*/for(i=1;i<=N1;i++){for(j=1;j<=N2;j++){printf("%5d",a[i][j]);}printf("\n");}getchar();//吞一个回车键return 0;
}
运行效果如下: