实验一 Matlab基础

1.1 Matlab基本语法

第1关:Hello MATLAB!

1. 编程要求

输出字符串“Hello MATLAB!”

2. 代码程序

disp('Hello MATLAB!') %字符类型的数据是用英文单引号' '来表示的

第2关:变量与表达式

1. 编程要求

本关的任务是设计一个一元二次函数 f(x) = 3x^2+2x+1,要求给x输入任意一个函数,能够输出它的结果 fx。

2. 代码程序

  • num2str(A):用于将数字A转换为字符串,“number to string”;
  • input():用于用户对程序内输入数据,x = input(prompt) 或 str = input(prompt,‘s’),前者表示输入一个数值,后者表示输入一个字符串,用户输入一个数据,以回车键结束,prompt表示提示语,一般是一个字符串,且这个字符串必须有(可以为空字符串’')。
x = input(''); %输入数字x
fx = 3*x^2+2*x+1;
disp(num2str(fx)); %输出字符串

第3关:初遇矩阵(数组)

1. 编程要求

创建一个以1~9顺序组成的3x3的矩阵A(即第一行为1,2,3,第二行为4,5,6,第三行为7,8,9),将每一行的数据分别求和,并存储到当前行的最后一列位置(第3列)去,最后用disp函数以字符串形式输出每一行和。

2. 代码程序

A = [1:3;4:6;7:9];
A(;,end) = sum(A,2); %每一行求和,结果存在最后一列中
%A(end,:) = sum(A,1); 对每一列求和,结果存在最后一行中
disp(num2str(A(1,end)));
disp(num2str(A(2,end)));
disp(num2str(A(3,end)));

1.2 Matlab语言程序设计基础

第1关:循环结构

1. 编程要求

列出1000以内的除13余2的所有整数

2. 代码程序

x = []; % 定义一个空向量
for i = 1:1000
    if rem(i,13) == 2
        x = [x, i]; % 将i添加到向量x的末尾
    end
end
disp(num2str(x(20:30))); % 显示第21到30个元素的字符串表示

第2关:符号替换

1. 编程要求

在这里插入图片描述
试用符号 fg 和 gf 分别表示函数 f(g(x)) 和 g(f(x)),最后输出fg和fg的表达式。

2. 代码程序

syms x; %syms声明符号变量x
f = x*sin(x)/(sqrt(x^2-2)*(x+5));
g = tan(x);
%subs(f,x,y)表示f(x)中x用y替换
fg = subs(f,x,g);
gf = subs(g,x,f);
disp(fg);
disp(gf);

第3关:Fibonacci数列计算

1. 编程要求

试编写小程序列出Fibonacci数列的前120项,将数列的值存入数组a中。

2. 代码文件

a(1) = 1;
a(2) = 1;
for i = 3:120
	x = a(i-1)+a(i-2);
	a = [a,x];
end
disp(a(100:120));

第4关:序列稳态值

1. 编程要求

在这里插入图片描述
已知该序列当n足够大时将趋于某个固定的常数,试选择合适的n值,找出该序列的稳态值(达到精度要求10^−14),并找出其精确地数学表示。

2. 代码程序

x1 = sym(1); %sym函数用于创建符号表达式
x2 = x1/2+3/(2*x1);
e = 10^(-14);
n = 2;
while double(abs(x2-x1)) > e
    x1 = x2;
    x2 = x1/2+3/(2*x1);
    n = n+1;
end
steady_value = x2;
disp(num2str(n))
disp(steady_value)

第5关:分段函数

1. 编程要求

y = h.(x>D)+h./(D.x).((x<=D) & (x>=-D))-h.(x<-D),根据提示,在右侧编辑器补充代码,根据输入的值h、D和x的变量值,计算如下分段函数的值:
在这里插入图片描述

2. 代码文件

  • 对于逻辑表达式当 x<10 时 y=sin(x),可以用 y=sin(x).*(x<10) 语句实现。
D = str2num(input('','s'));
h = str2num(input('','s'));
x = str2num(input('','s'));
y = h.*(x>D)+h./(D.*x).*((x<=D)&(x>=-D))-h.*(x<-D);
disp(num2str(y))

1.3 MATLAB矩阵进阶

第1关:字符串操作

1. 编程要求

读取3个字符串,分别取出每个字符串的第1个字符,拼接成一个新的字符串再输出(要求拼接顺序为原字符串读取的顺序,即第1个字符串的第1个字符同样是拼接后的字符串的第1个字符)。

2. 代码程序

A = input('','s');
B = input('','s');
C = input('','s');
D = strcat(strcat(A(1),B(1)),C(1)); %strcat水平连接字符串
disp(D);

第2关:矩阵运算

1. 编程要求

对给定的3个学生的三门成绩进行加权平均,算出学分绩,并且输出学分绩最高的同学的编号及学分绩。学分绩就是将给定的所有门成绩,各自乘上对应的学分,再除以总的学分。例如1号同学的三门成绩分别为90、80和70,三门课程的学分分别为3、2、4,那么学分绩的计算公式为 (90x3+80x2+70x4)/(3+2+4) = 78.89,这就是该同学的学分绩。

2. 代码程序

student_goals = [95,90,87;89,93,88;83,95,97]; %3名学生各自的三门成绩
course_credit = [2,4,5]; %三门课程各自的学分
%点乘.*即对应元素相乘
A = sum(student_goals(1,1:3).*course_credit);
B = sum(student_goals(2,1:3).*course_credit);
C = sum(student_goals(3,1:3).*course_credit);
S = [0,0,0];
S(1) = A/11;
S(2) = B/11;
S(3) = C/11;
%max函数默认按列进行操作
[y,I] = max(S); %求矩阵x中每列的最大值及其该元素的位置
%求矩阵中每行的最大值:max(S,[],2)
disp(num2str(I));
disp(num2str(y));

第3关:数据的导入与导出

1. 编程要求

  • 导入一份给定的学生成绩单src/lesson3/student.mat,该文件在目录src/lesson3下,学生人数及课程数未知,只知道每一行代表一名学生的所有成绩,而且每一列代表不同课程的成绩。
  • 导入一份给定的课程学分表src/lesson3/course_credit.mat,该文件在目录src/lesson3下,该数据只有一行,每一列代表一门课程的学分设置,数据个数保证和成绩单上的课程数一致。
  • 对给定的所有学生的各门成绩分别进行加权平均,算出各自的学分绩,并且输出学分绩最低的同学的编号及学分绩。
  • 学分绩就是将给定的所有门成绩,各自乘上对应的学分,再除以总的学分。例如1号同学的三门成绩分别为90、80和70,三门课程的学分分别为3、2、4,那么学分绩的计算公式为(90x3+80x2+70x4)/(3+2+4)= 78.89,这就是该同学的学分绩。

2. 代码程序

clc,clear;
%导入所有学生的各门成绩,注意这里是绝对路径引入
student_goals=load('src/lesson3/student.mat','-ascii'); 
%一个ascii编码形式存储的数据文件course_credit.mat
student_credits = load('src/lesson3/course_credit.mat','-ascii');
s = sum(student_credits);
A = student_goals.*student_credits;
B = sum(A,2)./s; %每行求和再除以总学分
[y,I] = min(B);
disp(num2str(I));
disp(num2str(y));

1.4 MATLAB程序控制结构进阶

第1关:智取第一式:分支结构

1. 编程要求

你现在扮演一名抗战时期的八路军地下工作者,组织上安排你去与另一名陌生的地下工作者会面,该同志与你会面时会向你说出他的上半句口令,你要完全正确的回答出下半句口令才会得到他的信任,从而顺利完成任务。组织上设置的口令有很多,但是,一般大家只会抽取其中的一句进行问答。所有问答展示如下:

  • Q: 田鸡炖土鸡 A: 附近有妖气
  • Q: 熟读唐诗三百首 A: 不会吟诗我不走
  • Q: 天空飘来5个字 A: 关我什么事
  • Q: Who are you A: 社会主义接班人
  • 如果问题不是上述的4种情况之一,则回答:我不认识你

2. 代码程序

clc,clear;
question = input('','s');
answer = ''; %答案初始为空字符串
switch question
    case '田鸡炖土鸡'
        answer = '附近有妖气';
    case '熟读唐诗三百首'
        answer = '不会吟诗我不走';
    case '天空飘来5个字'
        answer = '关我什么事';
    case 'Who are you'
        answer = '社会主义接班人';
    otherwise
        answer = '我不认识你';
end
disp(answer);

第2关:智取第二式:循环结构

1. 编程要求

所谓的“斐波那契数列”其实并不复杂。给定初始的两个数,比如1和1,目前的数列中就只有1,1两个数。现在要对数列进行扩展,后面的每个数都是由前面的两个数求和得到的。例如第三个数为1+1=2,第四个数为1+2=3,以此类推为,最终构成的数列就是1,1,2,3,5,8,13……要求输出指定序号的某个数,比如第3个数,那就是2,比如第6个数,那就是8。创建一个长度为100的斐波那契数列,前两个数据为1,1,要求输入一个100以内的序号n,输出序列中该序号n对应的斐波那契数。

2. 代码文件

clc;
clear;
num=input(''); %输入待输出斐波那契数的序号
f=zeros(1,100); %初始化
f(1) = 1;
f(2) = 1;
for i = 3:100
    f(i) = f(i-1)+f(i-2);
end
disp(num2str(f(num))); %输出序号num对应的斐波那契数

第3关:智取第三式:自定义函数

1. 编程要求

将之前的两个关卡中的程序封装成两个函数answer_me和fibonacci,要求输入字符串answer_me的时候运行第一个关卡对应的函数answer_me,输入字符串fibonacci时运行第二个关卡对应的函数fibonacci。让我们一起开始新的内容吧。

  • 要求创建的answer_me函数带一个字符串型输入参数,即answer_me(string),其中,string表示另一位地下工作者的问话,无返回值,其他要求同第一关卡要求(即在函数中输出对应于问题的回答)。
  • 要求创建的fibonacci函数带一个整数型输入参数,即fibonacci(N),其中,N表示要输出值的序号,函数有一个返回值f,是序号N对应的斐波那契数(同第二关卡要求),即f=fibonacci(N),最后在主函数function_test中输出该值f。

2. 代码文件

function function_test(string,datain)
%string是待执行函数名,datain是函数的输入参数
    if strcmp(string,'answer_me')   %如果是answer_me函数
        answer_me(datain);    %执行函数,在函数内输出回答
    end
    if strcmp(string,'fibonacci')   %如果是fibonacci函数
        fab = fibonacci(datain); %执行函数,返回对应于序号num的斐波那契数
        disp(num2str(fab)); %输出对应于序号num的斐波那契数
    end 
end

function answer_me(question)
switch question
    case '田鸡炖土鸡'
        answer = '附近有妖气';
    case '熟读唐诗三百首'
        answer = '不会吟诗我不走';
    case '天空飘来5个字'
        answer = '关我什么事';
    case 'Who are you'
        answer = '社会主义接班人';
    otherwise
        answer = '我不认识你';
end
disp(answer);
end

function fab = fibonacci(num)
f=zeros(1,100);
f(1) = 1;
f(2) = 1;
for i = 3:100
    f(i) = f(i-1)+f(i-2);
end
fab = f(num);
end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值