Matlab文件的调试(循环结构和函数结构)

一、实验目的

(1)掌握建立和执行函数文件的方法

(2)掌握利用for语句和while语句实现循环结构的方法

(3)掌握定义和调用MATLAB函数的方法

(4)熟悉利用向量运来代替循环操作的方法

二、实验原理与实验设备

原理计算机编程相关知识技能和MATLAB软件编译环境

设备:计算机与MATLAB软件

三、建立和执行函数文件

定义一个函数文件,求给定复数的指数、对数、正弦和余弦,并在脚本文件中调用该函数文件。

%T3
function [y1,y2,y3,y4] = fushu(a,b) 
     %建立y1,y2,y3,y4关于a和b的函数关系
y1=exp(a+b*i)    %y1求出定复数的指数
y2=log(a+b*i)    %y2求出定复数的对数
y3=sin(a+b*i)    %y3求出定复数的正弦
y4=cos(a+b*i)    %y3求出定复数的余弦
end

四、循环结构

1.根据y=1+1/3+1/5+……+1/(2n-1),求 (1)y<3时的最大值;(2)与(1)的n值对应的y值。

%T4.1
y1=0;
for n1=1:1000000    %设置循环,由于不知道会循环多少次,则把数设置成一个很大的数
    y1=y1+(1/(2*n1-1)); %根据题目写出y1关于n1的关系
    if y1<3       %要是y1的值小于3,则继续进入到循环里
        continue
    end
    break    %当找到y1的值大于3后直接结束循环
end
n1=n1-1   %由于找到的n1值是第一个大于3的值,因此要减去1
y1=y1-(1/(2*n1-1))   
%同理,循环出来的是第一个大于3的n1的值对应的y1值,因此要减去上一个n1值对应的y1值

2.已知f1=1, f2=0, f3=1, fn=fn-1-2fn-2+fn-3求,f1~f100中:(1)最大值、最小值、各数之和。(2)正数、零、负数的个数。

%T4.2
for n2=1:100      %设置循环
    if n2==1      %当n2等于1的时候f等于1,n2等于2时f=0,n2等于3的时候f等于1
        f(n2)=1;
        max=f(n2);   %先假设最大值为最初值
    elseif n2==2
        f(n2)=0;
    elseif n2==3
        f(n2)=1;
    else    %当n2大于等于4后,满足题目条件
    f(n2)=f(n2-1)-2*f(n2-2)+f(n2-3);
    end
    if f(n2)>max    %如果在循环里出现f的值大于假设的最大值,则最大值被替换
        max=f(n2);
    end
end
maxf=max
minf=min(f)  %使用函数找出最小值和总数之和
sumf=sum(f)
zhengshu=length(find(f>0))  %先利用find的函数找出特殊值,再用length函数计算出个数
zero=length(find(f==0))
fushu=length(find(f<0))

3.求解圆周率π的近似值,使用常用公式之一π4*(1-1/3+1/5-1/7+1/9……),直到最后一项的绝对值小于10-7为止。

%T4.3
pi=1;
n3=3;
flag=-1;  %用于标记每一项前面的正负号
while 1/n3>10^(-7)  %当满足条件时,继续循环
    pi=pi+flag*(1/n3);  
    flag=-flag;  %改变正负号
    n3=n3+2;  
end
pi=4*pi

4.若两个连续自然数的乘积减1是素数,则称这两个连续自然数是亲密数对,该素数是亲密素数。例如,2*3-1=5,由于5是素数,所以2和3是亲密数对,5是亲密素数。求[2,50]区间内:(1)有多少个亲密数对。(2)与上述亲密数对对应的所有亲密素数之和。

%T4.4
n=0;%用于计算亲密数对的数量
sumsushu=0;%用于计算亲密素数的总和
for x=2:49  %设置循环要求,不能设置成2:50,因为要是50和51为亲密数对,那么51不在范围内
    y4=x*(x+1)-1;  %判断是否为亲密素数、亲密数对的条件
    for i=2:y4    %判断y4是否为素数,需要重新设置循环去判断
        if rem(y4,i)~=0   %用求余函数,用y4除以从2到它本身的数再求余
                          %要是余数不等于0则循环继续
            continue
        end               %要是余数等于0则循环结束
        break
    end
    i;
    if i==y4             %要是余数等于0且i=y4,即它本身,则可判断此数为素数
        n=n+1;           %亲密数对+1
        sumsushu=sumsushu+y4;  %亲密素数之和累计叠加
    end
end
n   %最后输出亲密数对的个数和亲密素数之和
sumsushu

五、函数文件

1.一个自然数是素数,且它的数字位置经过任意兑换后仍为素数,则称之为绝对素数。例如13是绝对素数,试求所有两位绝对素数。要求:定义一判断素数的函数文件。

%T5.1
function t51 %定义函数判断是否为绝对素数
for j=10:99  %因为是两位数,因此数应该是从10到99
    for i=2:j  %循环的嵌套,用于判断该两位数是否为素数
        if rem(j,i)~=0  %用该两位数除以从2到它本身的数求余
            continue   %要是求余不等于0,循环继续
        end
        break  %要是求余等于0,循环结束
    end
    i;
    if i==j  %如果求余等于0且只能除以它本身的数,则这两位数为素数
        u=rem(j,10); %求出该两位数的个位数字
        v=(j-u)/10;  %求出该两位数的十位数字
        t=u*10+v;    %将该两位数进行对换形成新的两位数t
        for s=2:t   %对t进行素数的判断
            if rem(t,s)~=0
                continue
            end
            break
        end
        s;
        if s==t  %在j是素数的基础上判断t为素数,则输出原有两位数j
            disp(j)
        end
    end
end

2.已知y=f(40)/(f(30)+f(20))。求(1)当f(n)=n+10ln(n2+5)时,y的值时多少?(2)当f(n)=1*2+2*3+3*4++n*(n+1)时,y的值是多少。

(1) (2)

function [f] = t52(n) %建立f关于n的函数
f=n+10*log(power(n,2)+5)  %f与n的关系
end
function [h]=t522(n) %建立h与n的函数
h=0;  %起初h等于0,后面在循环里累计叠加
for i=1:n  %设置循环次数,从1到n
    h=h+n*(n+1) ;
end
end

3.魔方矩阵又称幻方,是有相同的行数和列数,并在每行每列、对角线上的和都相等的矩阵。魔方矩阵中的每个元素不能相同。MATLAB中可用magic(x)生成行、列数为x的矩阵。本题需要设计一个验证魔方矩阵的函数,通过计算矩阵各行、各列以及对角线元素之和,验证上述特性是否成立。

function mofang(A)
[n,m] = size(A);
if n<3 || m<3
    disp('你输入了一个错误的矩阵');
elseif n ~= m
    disp('输入的矩阵必须是方阵!');
else
    B = [sum(A,1),sum(A,2)',sum(diag(A))',sum(diag(rot90(A)))'];
    if B(1) == B(2) & B(2) == B(3) & B(3) == B(4) & B(4) == B(1)
        disp('这是一个魔方矩阵');
    else
        disp('这不是一个魔方矩阵');
    end
end

六、二维图形

  1. 已知y1 =x2 , y2 =cos(2x), y3 = y1*y2 ,完成下列操作。
  1. 在同一坐标系下用不同的颜色和线型绘制3条曲线。
  2. 以子图形式绘制3条曲线。
%T6.1
x61=0:pi/100:2*pi; %定义x61为列向量,在0到2*pi之间,增幅为pi/100
y61=power(x61,2);  %定义y61与x61的关系
y62=cos(2.*x61);   %定义y62与x61的关系
y63=y61.*y62;   %定义y63与x6的关系
plot(x61,y61,'b',x61,y62,'g',x61,y63,'r') %同时将三条线绘制在一个图像上
%y61是蓝色曲线,y62是绿色曲线,y63是红色曲线

%T6.2
x62=0:pi/100:2*pi; %定义x62为列向量,在0到2*pi之间,增幅为pi/100
y621=power(x62,2);  %定义y621与x62的关系
y622=cos(2.*x62);   %定义y622与x62的关系
y623=y621.*y622;     %定义y623与x62的关系
%将图像分割成三个图像
subplot(1,3,1)   %第一个图像
plot(x62,y621)
title('y621');
axis([0,2*pi,-30,40]);
subplot(1,3,2)  %第二个图象
plot(x62,y622)
title('y622');
axis([0,2*pi,-30,40]);
subplot(1,3,3)  %第三个图像
plot(x62,y623)
title('y623');
axis([0,2*pi,-30,40]);

六、实验总结

简单陈述一下本次实验后对于函数文件和循环结构的认知,简述你觉得困扰的地方。

循环结构常用有两种,一种是for循环,一般情况下,对于事先能确定循环次数的循环结构,使用for语句是比较方便的,比如[2:50];

for 循环变量=表达式1:表达式2:表达式3

     循环语句

end

另一种是while循环,一般情况下,条件为 true 时重复执行的 while 循环,这种适用于没有给出具体的循环范围,但又需要借助循环结构来判断条件输出特定的结果。

while 条件

    循环语句体

End

函数结构,将特定的算法写成函数的形式,可以提高程序的可重复性和程序设计的效率。并且函数文件定义了输出参数和输入参数的对应关系,方便外部调用。事实上,MATLAB提供的标准函数都是由函数文件定义的。

函数文件由function语句引导,其基本结构如下:

f unction 输出参数表=函数名(输入参数表)

函数体语句

困扰:循环的嵌套,在实验中,在涉及多个循环的时候,究竟哪个循环在哪个循环的里面,哪个循环又在哪个循环的外面,什么时候应该用continue继续循环,什么时候应该用break跳出循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值