条件与循环(2019.10.21)

一、循环控制语句之一:for/end

for/end 是用于要求重复多次执行 for 与 end 之间的程序语句,它允许嵌套使用。其书写格式如下:

for 变量 = 起点:增量:终点
程序语句
end (% 与for循环相对应的语句)

例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 之间的程序语句,否则结束循环。
其循环格式如下:

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

用迭代法求解下列线性方程组:

Alt
解:
将上述方程组改成迭代形式
Alt
由此写成矩阵迭代形式为
Alt
在命令窗口输入如下程序:

(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 语句是判定一个逻辑表达式,由逻辑表达式的值来决定是否执行它下面的一组程序语句。在最简单的情况下,它的语法结构如下:

if 逻辑表达式
程序语句
end

例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 条件语句,其结构形式如下:

if 逻辑表达式 1
   程序语句1
 elseif 逻辑表达式 2
   程序语句2
 elseif 逻辑表达式 3
   程序语句3
   ……
else
   程序语句 n
 end

唯有else是无逻辑表达式。

例3-11

用二分法求多项式的根。已知多项式为:
Alt
它在区间[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求根,它能把所有的根都求出来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值