香山书院分享 http://blog.sciencenet.cn/u/wjwqbit we're back, we're back in San Francisco

博文

matlab矩阵维数不一致出错

已有 11689 次阅读 2010-12-29 14:05 |个人分类:matlab应用|系统分类:科研笔记|关键词:学者| 虚数, 复数, 变量重定义, clear

    使用matlab画电路传输函数图时,经常用到虚数符号“i”。但一不小心可能就出错噢。这不,刚才我就遇到两个问题:
(1)、矩阵维数不一致;
(2)、虚数符号“i”问题。
   
下面一一说明。 
(1)、矩阵维数不一致
    matlab矩阵运算需要各变量的维数一致,不然会出现“Inner matrix dimensions must agree”错误。例如:

%错误程序

% 功能说明:滤波器的传递函数(R0+R1)*ones(size(f))+

clc
fmax=(10^4);
f=[0:1:fmax];                    % 1MHz,步进为0.1Hz
w=2*pi*f;                             % 角频率与频率之间转换
R0=( 1*10^4 )   
R1=( 1*10^5 )
C1=( (22)*10^(-6) )
Rf=( 1*10^(5) )
Hw=-w*(R0*Rf*C1*i)./( 1+w*(R0*R1*C1*i));


    传输函数“Hw=-w*(R0*Rf*C1*i)./( 1+w*(R0*R1*C1*i))”中,w为1x10000的向量,而分母中“1+w*(R0*R1*C1*i)”表示常数“1”与w的向量相加,因此维数不一样,旧版的matlab会出错。但新版的matlab(如matlab7.0以上)不会出错,新版一把常数自动与w向量维数匹配上了。如果使用旧版matlab,可以这样:“Hw=-w*(R0*Rf*C1*i)./( ones(w)+w*(R0*R1*C1*i))”。

(1)、虚数符号“i”问题。
 
   matlab默认时把符号“i”看作是虚数符号,因此下面这段程序看似没问题。但偶尔还会出问题的噢。如果在程序运行前已经存在i变量,而运行这段程序时没有清零变量,那么可能出现矩阵维数不一致问题。例如程序运行前,已存在变量i=[0:100,运行下面这段程序前未加“clear”清空变量,则此时matlab并未把“i”看作虚数符号。因此运行下面这段matlab代码时报错。

% 功能说明:滤波器的传递函数
%syms w R0 R1 C1 Rf
%Hw=-( R0+i*w*R0*R1*C1)*(i*w*Rf*C1)/( R0+R1+i*w*R0*R1*C1 ) ;
%Hw=Hw*conj(Hw);        % 共轭复数

clc
fmax=(10^4);
f=[0:0.1:fmax];                    % 1MHz,步进为0.1Hz
w=2*pi*f;                             % 角频率与频率之间转换
R0=( 1*10^4 )   
R1=( 1*10^5 )
C1=( (22)*10^(-6) )
Rf=( 1*10^(5) )
Hw=-w*(R0*Rf*C1*i)./( (R0+R1)*ones(size(f))+w*(R0*R1*C1*i));
H=abs(Hw) ;                % 取模
H_theta=angle(Hw)/pi*180;  % 求相角

figure(1);
loglog(f,H); grid on         % 双对数坐标
axis([0 1000 0.005 3]);   % 显示范围

 解决办法是,在每个.m文件前面加“clear”语句清空变量。如下:

% 功能说明:滤波器的传递函数
%syms w R0 R1 C1 Rf
%Hw=-( R0+i*w*R0*R1*C1)*(i*w*Rf*C1)/( R0+R1+i*w*R0*R1*C1 ) ;
%Hw=Hw*conj(Hw);        % 共轭复数

clc
clear
fmax=(10^4);
f=[0:0.1:fmax];                    % 1MHz,步进为0.1Hz
w=2*pi*f;                             % 角频率与频率之间转换
R0=( 1*10^4 )   
R1=( 1*10^5 )
C1=( (22)*10^(-6) )
Rf=( 1*10^(5) )
Hw=-w*(R0*Rf*C1*i)./( (R0+R1)*ones(size(f))+w*(R0*R1*C1*i));
H=abs(Hw) ;                % 取模
H_theta=angle(Hw)/pi*180;  % 求相角

figure(1);
loglog(f,H); grid on         % 双对数坐标
axis([0 1000 0.005 3]);   % 显示范围

 

 

 



https://m.sciencenet.cn/blog-331690-398747.html

上一篇:《从优秀到卓越》--吉姆·柯林斯

1 杨华磊

发表评论 评论 (1 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-19 13:53

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部