找回密码
 注册
Simdroid-非首页
查看: 252|回复: 16

判断资料后矩阵对角化数据前后相乘的程序(TR(Yg-Yg)注入模型-谢谢lin2009大帮助)

[复制链接]
发表于 2010-4-28 16:45:46 | 显示全部楼层 |阅读模式 来自 台湾
本帖最后由 武神裝攻 于 2010-6-2 14:27 编辑

小弟没有七颗龙珠无法请神龙
在此跪求板上英雄出击帮想解决程序
小弟的EXCEL表格1内容:
支路号

起始点

终止点

支路类型编号

1

0

1

1

2

1

2

1

3

2

3

2

4

2

4


3

小弟的EXCEL表格2内容:
1001

1002

1003

2001

2003

3001

3003

4001

开始:
设:
A=3
B=2
C=1
(1)看表1支路号 = 1 支路类型编号 = 1找到 终止点 = 1 起始点 = 0
看表2内容与相终止千位数为1的有1001,1002,1003共3

因为支路类型编号 =1
支路类型编号相对应的(类型1-A,类型2-B,类型3-C)
故X=[A A A  =[3 3 3    3*3大小的矩阵  且 终止点 = 1 起始点 = 0 故只要X放入Y
          A A A     3 3 3
          A A A     3 3 3]
   Y=[3 3 3   
          3 3 3
          3 3 3]
(2)看表1支路号 = 2 支路类型编号 = 1找到 终止点 = 2 起始点 = 0
看表2内容与相终止千位数为2的有2001,2003共2

因为支路类型编号 =1
支路类型编号相对应的(类型1-A,类型2-B,类型3-C)
故X=[A 0  A   =[3 0 3   因為表2个位数沒有2所以补0
          0  0  0      0 0 0
          A 0  A      3 0 3
终止点 = 2 起始点 = 1
Y=[3  3  3  0  0  0   又起始点 = 1      Y=[6  3  6  0  0  0
      3  3  3  0  0  0  所以刚终止点 = 1          3   3  3   0  0   0
      3  3  3  0  0  0  也要+X                            6   3  6   0  0   0
      0  0  0  3  0  3                                           0   0  0   3  0   3
      0  0  0  0  0  0                                           0   0  0   0  0   0
      0  0  0  3  0  3                                           0   0  0   3  0   3
(3)看表1支路号 = 3 支路类型编号 = 2找到 终止点 = 3 起始点 = 2
看表2内容与相终止千位数为3的有3001,3003共2

因为支路类型编号 =2

支路类型编号相对应的(类型1-A,类型2-B,类型3-C)
故X=[B 0  B   =[2 0 2   因為表2个位数沒有2所以补0
          0  0  0      0 0 0
          B 0  B      2 0 2
终止点 = 3 起始点 = 2
Y=[6  3  6  0  0  0  0  0  0   又起始点 = 2     Y=[6 3 6 0 0 0 0 0 0
      3  3  3  0  0  0  0  0  0  所以刚终止点 = 2         3 3 3  0 0 0 0 0 0
      6  3  6  0  0  0  0  0  0  也要+X                           6 3 6 0 0 0 0 0 0  
      0  0  0  3  0  3  0  0  0                                          0 0 0 5 0 5 0 0 0
      0  0  0  0  0  0  0  0  0                                          0 0 0 0 0 0 0 0 0
      0  0  0  3  0  3  0  0  0                                          0 0 0 5 0 5 0 0 0
      0  0  0  0  0  0  2  0  2                                          0 0 0 0 0 0 2 0 2
      0  0  0  0  0  0  0  0  0                                          0 0 0 0 0 0 0 0 0
      0  0  0  0  0  0  2  0  2                                 0 0 0 0 0 0 2 0 2  
(4)看表1支路号 = 4 支路类型编号 = 3找到 终止点 = 4 起始点 = 2
看表2内容与相终止千位数为4的有4001共1

因为支路类型编号 =3

支路类型编号相对应的(类型1-A,类型2-B,类型3-C)
故X=[C 0  0   =[1 0 0   因為表2个位数沒有2,3所以补0
          0  0  0      0 0 0
          0 0  0       0 0 0
终止点 = 3 起始点 = 2
Y=[6  3  6  0  0  0  0  0  0  0  0  0 又起始点 = 2    
      3  3  3  0  0  0  0  0  0  0  0  0  所以刚终止点 = 2         
      6  3  6  0  0  0  0  0  0  0  0  0 也要+X                           
      0  0  0  5  0  5  0  0  0  0  0  0                                       
      0  0  0  0  0  0  0  0  0  0  0  0                                       
      0  0  0  5  0  5  0  0  0  0  0  0                                       
      0  0  0  0  0  0  2  0  2  0  0  0                                       
      0  0  0  0  0  0  0  0  0  0  0  0                                       
      0  0  0  0  0  0  2  0  2  0 0  0
      0  0  0  0  0  0  0  0  0  1 0 0
      0  0  0  0  0  0  0  0  0  0 0 0
      0  0  0  0  0  0  0  0  0  0 0 0
最后
Y=[6  3  6  0  0  0  0  0  0  0  0  0   
      3  3  3  0  0  0  0  0  0  0  0  0         
      6  3  6  0  0  0  0  0  0  0  0  0                          
      0  0  0  6  0  5  0  0  0  0  0  0                                       
      0  0  0  0  0  0  0  0  0  0  0  0                                       
      0  0  0  5  0  5  0  0  0  0  0  0                                       
      0  0  0  0  0  0  2  0  2  0  0  0                                       
      0  0  0  0  0  0  0  0  0  0  0  0                                       
      0  0  0  0  0  0  2  0  2  0  0  0
      0  0  0  0  0  0  0  0  0  1  0  0
      0  0  0  0  0  0  0  0  0  0  0  0
      0  0  0  0  0  0  0  0  0  0  0  0
                        

 楼主| 发表于 2010-4-29 14:50:21 | 显示全部楼层 来自 台湾
Simdroid开发平台
本帖最后由 武神裝攻 于 2010-4-29 15:26 编辑

小弟有一范例类似
Q=[3 2 1;2 3 2;1 2 3];
P=[3;1;2;4];
利用条件S求P*Q依对角化排列
S=7取3*3
S=6取3*3中1.3的2*2
S=5取3*3中2.3的2*2
S=4取3*3中1.5的2*2
S=3取3*3中3的1*1
S=2取3*3中2的1*1
S=1取3*3中1的1*1
程序:
S=[7;7;1;6];
NO=[1;2;3;4];
K=length(NO)*3;
P=[3;1;2;4];
Q=[3 2 1;2 3 2;1 2 3];
zp=zeros(K,K);
for a=1:length(NO)
   zz=(P(a,1)*Q);
   AA=0; AB=0; AC=0; BA=0; BB=0; BC=0; CA=0; CB=0; CC=0;
    switch S(a,:)
        case 6
            AA=zz(1,1);
            AC=zz(1,3);
            CA=zz(3,1);
            CC=zz(3,3);   
        case 5
            BB=zz(2,2);
            BC=zz(2,3);
            CB=zz(3,2);
            CC=zz(3,3);
        case 4
            AA=zz(1,1);
            AB=zz(1,2);
            BA=zz(2,1);
            BB=zz(2,2);
        case 3
            CC=zz(3,3);
        case 2
            BB=zz(2,2);
        case 1
            AA=zz(1,1);
        otherwise
            AA=zz(1,1);
            AB=zz(1,2);
            AC=zz(1,3);
            BA=zz(2,1);
            BB=zz(2,2);
            BC=zz(2,3);
            CA=zz(3,1);
            CB=zz(3,2);
            CC=zz(3,3);
    end
    zp(a*3-2,a*3-2)=AA;
    zp(a*3-2,a*3-1)=AB;
    zp(a*3-2,a*3)=AC;
    zp(a*3-1,a*3-2)=BA;
    zp(a*3-1,a*3-1)=BB;
    zp(a*3-1,a*3)=BC;
    zp(a*3,a*3-2)=CA;
    zp(a*3,a*3-1)=CB;
    zp(a*3,a*3)=CC;  
end
恳请板上英雄大力相助完成程序
回复 不支持

使用道具 举报

发表于 2010-4-29 16:41:15 | 显示全部楼层 来自 上海
游戏中的?
哥们儿挺有想法啊,学以致用。
回复 不支持

使用道具 举报

发表于 2010-4-29 16:44:13 | 显示全部楼层 来自 上海
全是数字,看起来眼晕,所以就没有细看。
你这也就是需要按照一定的规则构造出一个矩阵Y就可以了?其实没有什么难度的啊,只需要按照规则写一个多层嵌套的语句就可以了啊。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-4-30 08:53:57 | 显示全部楼层 来自 台湾
恩~感觉很难的是要连起始点所指的矩阵也要变动小弟matlab也学没多久所以还需大家的帮助
回复 不支持

使用道具 举报

发表于 2010-4-30 14:51:23 | 显示全部楼层 来自 湖南湘潭
1# 武神裝攻
应该把内容整理清楚,如表格2中的1001等,千位表示什么,个位表示什么应说清楚。ABC代表什么意思?应该是与支路类型编号相对应的(类型1-A,类型2-B,类型3-C),不说清楚,非得要让大家亲自动手从一大段的文字中找出这蛛丝马迹来!

编程不难,把关系理清楚了就不难。
相类似的路径问题,你也发了不少的帖子了,综合整理一下应该就可以解决问题。

另外,标题不要哗众取宠,即使是你心情很迫切!

介绍时,要把问题背景、对象稍微说明,不要担心会被人家学去了,这本来就是一个技术交流的论坛,上来了就不要遮遮掩掩的。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-4-30 15:52:42 | 显示全部楼层 来自 台湾
回答:
(1-1)EXCEL 2 内容单纯是小弟随意编的动作指令,像是电脑作自动控制4Bit指令要拆解做个部动作。
(1-2)小弟想说省空间,故用同颜色字体做表示,看来纯属自己想太快是小弟疏失。

(2)恩确实也从各位英雄身上吸收了知识,但是希望程式是完善故越来越困难,但小弟确定每次发问确实都有其难关希望求解

(3)确实深感抱歉,但是我已表明只是矩阵问题,矩阵可以做很多事矩阵的计算人人都会遇到,至于用到哪我可以说控制会用到,管理会用到总归只是单纯小弟构想,想试试矩阵的应用

大大的说明小弟名记在心下次发文会再努力改善的感激
回复 不支持

使用道具 举报

发表于 2010-5-3 19:47:02 | 显示全部楼层 来自 湖南湘潭
参考程序:
clear all
clc
Info = [
    1     0     1     1
    2     1     2     1
    3     2     3     2
    4     2     4     3];
Cmd = [
    1001
    1002
    1003
    2001
    2003
    3001
    3003
    4001
    ];
c1 = floor(Cmd/1000); % 千位数
c2 = mod(Cmd,10);     % 个位数
ABC = [3,2,1];            % ABC的代码值

for k = 1: size(Info,1)
    lacks = setdiff([1,2,3],c2(c1 == k)); % 缺少的数字
    X = ABC(Info(k,4))*ones(3,3);
    if ~isempty(lacks)
        for n = 1:length(lacks)
            X(lacks(n),:) = 0;
            X(:,lacks(n)) = 0;
        end
    end
    Yk{k} = X;
end
for k = 1: size(Info,1)
    for kk = 1:size(Info,1)
        if k ~= kk && Info(kk,2) == Info(k,3)  % 起点 = 终点
            Yk{k} = Yk{k} + Yk{kk};
        end
    end
end

Y = blkdiag(Yk{:})

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-5-27 10:20:01 | 显示全部楼层 来自 台湾
本帖最后由 武神裝攻 于 2010-5-31 09:33 编辑

想问
要是A=0   我又想删掉缺相的位置
最後
Y=
Y=[0  0  0  0  0  0  0  0   
      0 0  0  0  0  0  0  0            
      0  0  0  0  0  0  0  0                        
      0  0  0  3  2  0  0  0                                                                     
      0  0  0  2  2  0  0  0                                         
      0  0  0  0  0  2  2  0                                                           
      0  0  0  0  0  2  2  0  
      0  0  0  0  0  0  0  1  


小弟是想
rowindex = sum(Y==0,2)==size(Y,2);
colindex = sum(Y==0,1)==size(Y,1);
Y(rowindex,:) = [];
Y(:,colindex) = [];
Y2=Y
但是失败....
回复 不支持

使用道具 举报

 楼主| 发表于 2010-5-31 17:01:09 | 显示全部楼层 来自 台湾
本帖最后由 武神裝攻 于 2010-5-31 17:03 编辑

想问
要是A=0   我又想删掉缺相的位置

最後
Y=[0  0  0  0  0  0  0  0   
      0 0  0  0  0  0  0  0            
      0  0  0  0  0  0  0  0                        
      0  0  0  3  2  0  0  0                                                                     
      0  0  0  2  2  0  0  0                                         
      0  0  0  0  0  2  2  0                                                           
      0  0  0  0  0  2  2  0  
      0  0  0  0  0  0  0  1  
已修正Y
回复 不支持

使用道具 举报

发表于 2010-5-31 21:33:54 | 显示全部楼层 来自 湖南湘潭
没看明白
小弟是想
rowindex = sum(Y==0,2)==size(Y,2);
colindex = sum(Y==0,1)==size(Y,1);
Y(rowindex,:) = [];
Y(:,colindex) = [];
Y2=Y
但是失败....

至少你要把上一段程序运行前的Y值给出来,才能知道你失败在哪里。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-6-1 09:20:13 | 显示全部楼层 来自 台湾
是的,小弟事依照真实变压器情况,所以A要设为0
也就是 ABC = [3,2,1];改为ABC = [0,2,1];
所以lin2009大 所说的程序:
clear all
clc
Info = [
    1     0     1     1
    2     1     2     1
    3     2     3     2
    4     2     4     3];
Cmd = [
    1001
    1002
    1003
    2001
    2003
    3001
    3003
    4001
    ];
c1 = floor(Cmd/1000); % 千位?
c2 = mod(Cmd,10);     % ?位?
ABC = [0,2,1];            % ABC的代?值
for k = 1:size(Info,1)
    lacks = setdiff([1,2,3],c2(c1 == k)); % 缺少的?字
    X = ABC(Info(k,4))*ones(3,3);
    if ~isempty(lacks)
        for n = 1:length(lacks)
            X(lacks(n),:) = 0;
            X(:,lacks(n)) = 0;
        end
    end
    Yk{k} = X
   
end
for k = 1: size(Info,1)
    for kk = 1:size(Info,1)
        if k ~= kk && Info(kk,2) == Info(k,3)  % 起? = ??
            Yk{k} = Yk{k} + Yk{kk};
        end
    end
end
Y = blkdiag(Yk{:});
Y2=Y;
rowindex = sum(Y2==0,2)==size(Y2,2);
colindex = sum(Y2==0,1)==size(Y2,1);
Y2(rowindex,:) = [];
Y2(:,colindex) = [];

但是上面多加的紅字是将值为零的列行给删掉虽然可以删缺相但是也将支路类型是1也就是代A=0的矩阵一同删掉
倘若不加红字而是:
X(lacks(n),:) = 0; 改 X(lacks(n),:) = [];
X(:,lacks(n)) = 0; 改 X(:,lacks(n)) = [];
这样Yk至Y会出矩阵不符错
总结就是步骤缺相(表2个位数没有值) 改不补0
有补0                                                          不补0
0 0 0 0 0 0 0 0 0 0 0 0                                0 0 0 0 0 0 0 0   
0 0 0 0 0 0 0 0 0 0 0 0                                0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0                                0 0 0 0 0 0 0 0
0 0 0 3 0 2 0 0 0 0 0 0                                0 0 0 3 2 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0                                0 0 0 2 2 0 0 0
0 0 0 2 0 2 0 0 0 0 0 0                                0 0 0 0 0 2 2 0   
0 0 0 0 0 0 2 0 2 0 0 0                                0 0 0 0 0 2 2 0
0 0 0 0 0 0 0 0 0 0 0 0                                0 0 0 0 0 0 0 1
0 0 0 0 0 0 2 0 2 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
回复 不支持

使用道具 举报

发表于 2010-6-1 11:32:49 | 显示全部楼层 来自 湖南湘潭
本帖最后由 lin2009 于 2010-6-1 11:34 编辑

12# 武神裝攻

倘若不加红字而是:
X(lacks(n),:) = 0; 改 X(lacks(n),:) = [];
X(:,lacks(n)) = 0; 改 X(:,lacks(n)) = [];
这样Yk至Y会出矩阵不符错


删除的时候从后面先删除,就不会出现矩阵/数组“不符”的错了。

  1. for k = 1:size(Info,1)
  2.     lacks = sort(setdiff([1,2,3],c2(c1 == k)),2,'descend'); % 排序,序号最大的放在最前,也就最先删除。
  3.     X = ABC(Info(k,4))*ones(3,3);
  4.     if ~isempty(lacks)
  5.         for n = 1:length(lacks)
  6.             X(lacks(n),:) = [];
  7.             X(:,lacks(n)) = [];
  8.         end
  9.     end
  10.     Yk{k} = X;
  11. end
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-6-1 15:22:38 | 显示全部楼层 来自 台湾
本帖最后由 武神裝攻 于 2010-6-2 07:40 编辑

可是一样ㄝ
clear all
clc
Info = [
    1     0     1     1
    2     1     2     1
    3     2     3     2
    4     2     4     3];
Cmd = [
    1001
    1002
    1003
    2001
    2003
    3001
    3003
    4001
    ];
c1 = floor(Cmd/1000); % 千位?
c2 = mod(Cmd,10);     % ?位?
ABC = [0,2,1];            % ABC的代?值

for k = 1:size(Info,1)
    lacks = sort(setdiff([1,2,3],c2(c1 == k)),2,'descend'); % 排序,序号最大的放在最前,也就最先删除。
    X = ABC(Info(k,4))*ones(3,3);
    if ~isempty(lacks)
        for n = 1:length(lacks)
            X(lacks(n),:) = [];
            X(:,lacks(n)) = [];
        end
    end
    Yk{k} = X;
end
for k = 1: size(Info,1)
    for kk = 1:size(Info,1)
        if k ~= kk && Info(kk,2) == Info(k,3)  % 起? = ??
            Yk{k} = Yk{k} + Yk{kk};
        end
    end
end
Y = blkdiag(Yk{:});

出现
??? Error using ==> plus
Matrix dimensions must agree.
Error in ==> Untitled at 51
            Yk{k} = Yk{k} + Yk{kk};
回复 不支持

使用道具 举报

发表于 2010-6-2 09:19:38 | 显示全部楼层 来自 湖南湘潭
出现
??? Error using ==> plus
Matrix dimensions must agree.
Error in ==> Untitled at 51
            Yk{k} = Yk{k} + Yk{kk};

”性质一样,但是问题不一样。
换一种思路,要删除的位置先做标记,然后再删除。
应该可以的,你先试试。
回复 不支持

使用道具 举报

发表于 2010-6-2 10:20:28 | 显示全部楼层 来自 湖南湘潭
本帖最后由 lin2009 于 2010-6-2 10:22 编辑

你的问题先删除再计算,是不行的,因为后面的计算还需要用到删除前的矩阵。
只好在要删除的位置先做标记,然后全部计算完后再删除。
参考程序如下:

  1. clear all
  2. clc
  3. Info = [
  4.            1     0     1     1
  5.            2     1     2     1
  6.            3     2     3     2
  7.            4     2     4     3  ];
  8. Cmd = [
  9.         1001
  10.         1002
  11.         1003
  12.         2001
  13.         2003
  14.         3001
  15.         3003
  16.         4001 ];
  17. c1  = floor(Cmd/1000); % 千位数
  18. c2  = mod(Cmd,10);     % 个位数
  19. ABC = [0,2,1];        % ABC的代码值

  20. for k = 1:size(Info,1)
  21.     lacks = sort(setdiff([1,2,3],c2(c1 == k)),2,'descend'); % 缺少的数字
  22.                                                             % 排序,序号最大的放在最前,
  23.                                                             % 也就最先删除。(不必要)
  24.     X = ABC(Info(k,4))*ones(3,3);
  25.     if ~isempty(lacks)
  26.         X(lacks,:) = 0;                               % 改写,不必用循环。
  27.         X(:,lacks) = 0;
  28.     end
  29.     Yk{k} = X;
  30.     lackSet{k} = (k - 1)*3 + lacks;            % 记下需要删除的位置。
  31. end

  32. for k = 1: size(Info,1)
  33.     for kk = 1:size(Info,1)
  34.         if k ~= kk && Info(kk,2) == Info(k,3)   % 起点 = 终点
  35.             Yk{k} = Yk{k} + Yk{kk};
  36.         end
  37.     end
  38. end
  39. Y = blkdiag(Yk{:});
  40. Y([lackSet{:}],:) = [];
  41. Y(:,[lackSet{:}]) = [];
复制代码
回复 不支持

使用道具 举报

 楼主| 发表于 2010-6-2 14:18:29 | 显示全部楼层 来自 台湾
本帖最后由 武神裝攻 于 2010-6-2 14:34 编辑

谢谢lin2009大帮助完成潮流变压器(Yg-Yg)注入电流模型
[一般计算变压器会分开拆成 注入电流 与 线路阻抗]

顺便告知急用YY的各位ABC值中0是线路所以设0 2是变压器阻抗所以设yt(依自己实际变压器改)然后小弟程式有改有加算regulatorg;如有计算者请自行改Yk{k} = Yk{k} + Yk{kk};
[如果变压器regulator没说那程序会是全0的矩阵]

目前正在研究最难的三角-星型有兴趣者请一同讨论
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-6 21:27 , Processed in 0.048197 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表