这是一份利用MATLAB软件进行实验时记录的错误列表,随着实践进行,将持续更新此列表。
错误原因,矩阵下标溢出。
例如,
% M-file, tutex2.m
% 输入半径,计算圆的面积和球的体积
r = input('Type radius:'); % 从键盘输入Type radius的值,并将它赋值给r.
area=pi*r^2;
提示错误:
tutex2
Index exceeds matrix dimensions.
Error in tutex2 (line 5)
r = input('Type radius:'); % 从键盘输入Type radius的值,并将它赋值给r.
错误原因: 工作空间中有了一个变量叫input,因此matlab寻找这个变量,而不是执行input命令,
解决方法: clear input,清除变量即可。这里也提醒,不要变量名和函数名取做相同的,以免引起麻烦。
错误表现:
>> fx = 'x^2+x-2'
fx =
x^2+x-2
>> polyx = sym2poly(fx);
Undefined function 'sym2poly' for input arguments of type 'char'.
错误原因:
matlab支持三种方式创建符号表达式
1) fx = sym('x^2+x-2');% 利用sym('符号字符串')构成符号表达式
2) syms x;%利用syms定义符号变量
fx = x^2+x-2;%利用已定义的符号变量组成符号表达式
3)利用单引号创建符号表达式
fx = 'x^2+x-2'
关键问题是: 利用单引号生成的符号表达式建立的并不是真正意义上的符号表达式(sym类型),就是一个普通的字符串(char类型)。
如以下示例:
>> fx = 'x^2+x-2';
>> fy = sym('y^2+y-2');
>> whos
Name Size Bytes Class Attributes
fx 1x7 14 char
fy 1x1 60 sym
我们可以发现,利用单引号创建的符号表达式存贮为char类型,而不是sym类型。
解决方法: 先用sym函数将字符型转换为符号变量,再执行其他针对符号表达式的函数。
例如1:
>> fx = 'x^2+x-2';%建立符号表达式
>> fx = sym(fx);%转换为真正符号表达式
>> polyx = sym2poly(fx)
polyx =
1 1 -2
>> roots(polyx) %求取符号表达式的根
ans =
-2
1
例如2:
>> y = 'x^3+x^5'
y =
x^3+x^5
>> diff(y) %计算结果明显错误
ans =
-26 -43 -8 77 -26 -41
>> diff(sym(y)) %先转换为符号表达式,再求微分,结果正确
ans =
5*x^4 + 3*x^2
可以看出,使用了未转换的单引号符号表达式,会产生许多错误,要加以注意。
错误现象:
>> ft = sym('(44*t-2)^4+(92*t-6)^2'); >> ft_diff = diff(ft);%求导数 >> roots = solve(ft_diff) %求导数方程的根 roots = ((493684489^(1/2)*2776680568306630656^(1/2))/2776680568306630656 + 115/10307264)^(1/3) - 529/(1405536*((493684489^(1/2)*2776680568306630656^(1/2))/2776680568306630656 + 115/10307264)^(1/3)) + 1/22 (3^(1/2)*(529/(1405536*((493684489^(1/2)*2776680568306630656^(1/2))/2776680568306630656 + 115/10307264)^(1/3)) + ((493684489^(1/2)*2776680568306630656^(1/2))/2776680568306630656 + 115/10307264)^(1/3))*i)/2 + 529/(2811072*((493684489^(1/2)*2776680568306630656^(1/2))/2776680568306630656 + 115/10307264)^(1/3)) - ((493684489^(1/2)*2776680568306630656^(1/2))/2776680568306630656 + 115/10307264)^(1/3)/2 + 1/22 529/(2811072*((493684489^(1/2)*2776680568306630656^(1/2))/2776680568306630656 + 115/10307264)^(1/3)) - (3^(1/2)*(529/(1405536*((493684489^(1/2)*2776680568306630656^(1/2))/2776680568306630656 + 115/10307264)^(1/3)) + ((493684489^(1/2)*2776680568306630656^(1/2))/2776680568306630656 + 115/10307264)^(1/3))*i)/2 - ((493684489^(1/2)*2776680568306630656^(1/2))/2776680568306630656 + 115/10307264)^(1/3)/2 + 1/22 >> roots = vpa(solve(ft_diff)) %控制位默认精度显示 roots = 0.0615348488488 0.0374143937574 + 0.0363735994416*i 0.0374143937574 - 0.0363735994416*i >> size(roots) ans = 3 1
matlab控制显示精度有三个函数,format 格式化函数;vpa 将数据表示为n位有效位数的形式;digits 设置默认的精度。
解决方法:在用matlab计算过程中,产生如上的一大堆结果时,要注意精度控制,此时计算的结果是正确的,但我们会误以为是错误的。