条件与循环
一、循环控制语句之一:for/end
for/end 是用于要求重复多次执行 for 与 end 之间的程序语句,它允许嵌套使用。其书写格式如下:
例3-6
计算8阶Pascal矩阵的所有元素的总和。
>> A=pascal(8); %设A矩阵为Pascal 8阶矩阵
>> s=0; %设数值变量初值s为零
>> for i=1:8 %设置i为8次循环
s=s+sum(A(i,:)); %计算A矩阵的第i列元素的和
%sum为对矩阵(A,:)的i行元素求和命令;
end, s %结束循环,显示总和s
s =
12869
更简便的计算方法:
>> sum(sum(pascal(8)))
ans =
12869
例3-7
用Gauss消去法使已知 5 阶魔方矩阵变换为上三角矩阵。
>> A=magic(5) %设矩阵A为5阶魔方矩阵
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> for j=1:4 %设置列向操作次数,1~4列
for i=j+1:5 %设置行向操作次数,2~5行
A(i,:)=A(i,:)-A(i,j)/A(j,j)*A(j,:); %对矩阵A下三角进行消元操作
end %结束i循环
end,A %结束j循环,并显示消元后的结果
A =
17.0000 24.0000 1.0000 8.0000 15.0000
0 -27.4706 5.6471 3.1765 -4.2941
0 0 12.8373 18.1585 18.4154
0 0 0 -9.3786 -31.2802
0 0 0 0 90.1734
高斯消元法:可用来为线性方程组求解,求出矩阵的秩,以及求出可逆方阵的逆矩阵。当用于一个矩阵时,高斯消元法会产生出一个行梯阵式。
二、循环控制语句之二:while/end
while/end 与 for/end 不同,它不规定循环次数,而由 while 后面的条件表达式来决定,若条件成立,则重复执行 while 与 end 之间的程序语句,否则结束循环。
其循环格式如下:
例3-8
用迭代法求解 x3 -3 x2- 5 = 0 的一个实根。
解:把方程式改写成迭代形式 ,即 x = 3 + 5 / x2,并设初始值 x0 = 3,程序名为itersolvel:
>> x0=3;r=1;n=0; %初始设置,r为计算误差初值,n为迭代次数
>> while r>1e-5 %当迭代误差小于设定误差 1e-5 时,结束循环
x1=x0; %上次计算值代入下一次
x0=3+5/x1.^2; %迭代运算
r=abs(x0-x1); %误差运算
n=n+1; %迭代次数加1
end,x0,n %循环,循环结束后显示x0和n
%运行程序
x0 =
3.4260
n =
9
如果直接使用多项式求根命令,则得:
>> roots([1 -3 0 -5]) %roots为多项式求根命令,方括号内为求解方程式的系数向量
ans =
3.4260 + 0.0000i
-0.2130 + 1.1891i %共轭复根
-0.2130 - 1.1891i
例3-9
用迭代法求解下列线性方程组:
解:
将上述方程组改成迭代形式
由此写成矩阵迭代形式为
在命令窗口输入如下程序:
(1)迭代方法求解:
>> A1=[0 3/7 -2/7;-4/9 0 1/9;-6/11 -3/11 0] %迭代形式的系数矩阵
A1 =
0 0.4286 -0.2857
-0.4444 0 0.1111
-0.5455 -0.2727 0
>> B1=[17/7;29/9;35/11] %迭代形式的常数项列向量
B1 =
2.4286
3.2222
3.1818
>> X0=[0 0 0]';X1=[1 1 1]';n=0; %设置迭代向量的初值X0,X1,n为循环次数
>> while norm(X1-X0)>1e-5 %当差向量的范数小于1e-5时,终止循环,否则执行循环体
X1=X0;
X0=A1*X1+B1;
n=n+1;
end,X0,n %循环结束,显示迭代结果和迭代次数
X0 = %迭代结果
3.0000
2.0000
1.0000
n = %迭代次数
17
(2)逆矩阵方法求解:
>> A=[7 -3 2;4 9 -1;6 3 11]
A =
7 -3 2
4 9 -1
6 3 11
>> B=[17;29;35];
>> X=inv(A)*B; %逆矩阵
>> X'
ans =
3.0000 2.0000 1.0000
三、分支选择语句 if/end
if 语句是判定一个逻辑表达式,由逻辑表达式的值来决定是否执行它下面的一组程序语句。在最简单的情况下,它的语法结构如下:
例3-10
输入一整数,若能被 2 除尽,则显示它为偶数并显示除 2 后的商,否则显示此数为奇数。
解:
在M文件编辑器中输入如下程序(程序名为 examp3_8):
%本程序判断输入整数是偶数还是奇数
x=input('input a integer \n'); %输入整数
if rem(x,2)==0 %假如x能被2整除,则余数等于零,rem(a,b)为求a/b所得余数的函数
disp('x is even') %显示a为偶数,disp为显示字符串语句
b=x/2; %计算除2后的商
fprintf('%s%d\n','b=',b) %输出b,fprintf为格式数据语句
else disp('x is odd') %否则,显示x为奇数
end
在命令窗口运行上述程序如下:
>> examp3_8
input a integer
256
x is even
b=128
>> examp3_8
input a integer
235
x is odd
if 语句在程序中可以嵌套任意次。对于 if 语句后的逻辑表达式,如果判断一个非标量,那么它的所有元素必须为零,才认为是真。例如,若 X 是矩阵,程序为
if X
程序语句
end
那么它相当于
if all(X(:))
程序语句
end
四、多分支条件选择语句 if/elseif/…/else/end
elseif/else 是进一步的 if 条件语句,其结构形式如下:
唯有else是无逻辑表达式。
例3-11
用二分法求多项式的根。已知多项式为:
它在区间[0,4]中有一实根,且 f(0)<0,f(4)>0。求此实根,允许误差为1E-5。
解:
(1)编制用二分法解代数方程式的根的程序文件examp3_9如下:
%用二分法求多项式的实根
while abs(b-a)>tol %设置初值[a,b]及容许误差tol
x=(a+b)/2; %用二分法作试算值
fx=fun_101(x); %调用代数方程式的函数文件,fun_101为函数名
if fx<0 %若fx小于零,则缩小负值搜索区
a=x;
else b=x; %否则,缩小正值搜索区
end
end,x
编制已知代数式的函数文件为fun_101程序如下:
function y = fun_101( x )
y=x.^3-3*x.^2+5*x-7;
在命令窗口输入初值a,b和允差 tol ,并运行examp3_9结果如下:
>> a=0;b=4;tol=1e-5;
>> examp3_9
x =
2.1795
(2)用多项式求根的命令求解,则首先确定多项式的系数向量V,随后用roots(V)求解如下:
>> V=[1 -3 5 -7];
>> roots(V)
ans =
2.1795 + 0.0000i
0.4102 + 1.7445i
0.4102 - 1.7445i
注: 用roots求根,它能把所有的根都求出来。