一、实验的目的与要求
1、掌握 MATLAB的函数 2、掌握 MATLAB的程序流 3、掌握 MATLAB脚本和函数文件的编写 4、熟悉基于矩阵的程序设计与优化
二、实验原理
1、MATLAB的M文件:脚本文件与函数文件; 2、MATLAB程序流:input、disp、if 语句、for语句、while语句、swich case结构和try catch结构; 3、函数文件,匿名函数,文件中的函数; 4、MATLAB程序设计与优化:向量化设计代替循环语句、预定义变量等;
三、实验仪器
PC机100台及MATLAB软件
四、实验内容与步骤
(1)编写求解方程的根的函数(a,b,c的取值由用户输入决定),要求能够判断方程组解的情况,从而控制函数的输出。注:① 有输入参数的提示(如输入参数个数是否准确?缺省时如何处理?) ②在屏幕打印解的情况 ③最后输出具体解的值。
function [x1,x2] = solveEquation(a,b,c)
if nargin ~= 3
error('错误:输入参数数无效。请提供正好 3 个系数。')
end
if a == 0
error('误差:方程不是二次方程。系数 a 不能为零。')
end
discriminant = b^2 - 4*a*c;
if discriminant > 0
x1 = (-b + sqrt(discriminant)) / (2*a);
x2 = (-b - sqrt(discriminant)) / (2*a);
disp('方程有两个实根:')
disp(['x1 = ', num2str(x1)])
disp(['x2 = ', num2str(x2)])
elseif discriminant == 0
x1 = -b / (2*a);
disp('该等式有一个实根:')
disp(['x1 = ', num2str(x1)])
else
% discriminant < 0
realPart = -b / (2*a);
imagPart = sqrt(-discriminant) / (2*a);
disp('该等式有两个实根:')
disp(['x1 = ', num2str(realPart), ' + i', num2str(imagPart)])
disp(['x2 = ', num2str(realPart), ' - i', num2str(imagPart)])
end
end
clc,clear;
solveEquation(1,3,0);
(2)输入一个百分制成绩,要求输出成绩等级A+、A、B、C、D、E。其中100分为A+,90分~99分为A,80分~89分为B,70分~79分为C,60分~69分为D,60分以下为E。要求:
① 用switch语句实现; ② 输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出出错信息。
function grade = calculateGrade(score)
% 根据百分制成绩计算成绩等级
if score < 0 || score > 100
% 不合理的成绩
error('输入的成绩不合法,请输入0~100之间的数字。');
else
% 合理的成绩
switch floor(score / 10)
case 10
grade = 'A+';
case 9
grade = 'A';
case 8
grade = 'B';
case 7
grade = 'C';
case 6
grade = 'D';
otherwise
grade = 'E';
end
end
end
clc,clear;
score = input('请输入百分制成绩:');
grade = grades(score);
disp(['成绩等级:', grade]);
(3)求指定区间内第二个能被n整除的整数。例如求区间[200,500]中第二个能被32整除的整数。要求:
① 判断输入的合理性,输入参数必须是正整数,否则,重新输入,直到输入为整数才进行下一步。 ② 写成函数文件,可灵活更改区间范围和整数n的值。
function x = findSecondDivisibleNumberInRange(start, finish, n)
% 在指定区间内查找第二个能被 n 整除的整数
% 检查输入参数的合理性
if nargin ~= 3 || ~isnumeric(start) || ~isnumeric(finish) || ~isnumeric(n) || ...
start <= 0 || finish <= 0 || n <= 0 || start > finish
error('输入参数不合法,请输入三个正整数,且 start <= finish。');
end
% 查找第二个能被 n 整除的整数
count = 0;
for x = start : finish
if mod(x, n) == 0
count = count + 1;
if count == 2
return;
end
end
end
% 没有找到符合条件的整数
error('在指定区间内没有找到第二个能被 %d 整除的整数。', n);
end
start = input('请输入区间的起始值:');
finish = input('请输入区间的结束值:');
n = input('请输入整数 n 的值:');
x = findSecondDivisibleNumberInRange(start, finish, n);
fprintf('在区间 [%d, %d] 中,第二个能被 %d 整除的整数是 %d。\n', start, finish, n, x);
(4)根据,,当分别取100、1000和10000时,求的近似值,分别用循环语句和向量化的程序设计实现。注:向量化是指借助matlab中矩阵形式运算,速度较循环过程快。
循环
function approx = calculatePiApproximationLoop()
for n = [100, 1000, 10000]
sum = 0;
for i = 1 : n
sum = sum + 1 / i^2;
end
approx = sqrt(6 * sum);
fprintf('当 n = %d 时,近似值为 %f。\n', n, approx);
end
end
向量
function approx = calculatePiApproximationVectorized()
for n = [100, 1000, 10000]
i = 1 : n;
s = sum(1 ./ i.^2);
approx = sqrt(6 * s);
fprintf('当 n = %d 时,近似值为 %f。\n', n, approx);
end
end
approxLoop = calculatePiApproximationLoop();
approxVectorized = calculatePiApproximationVectorized();
fprintf('循环方式的近似值为 %f,向量化方式的近似值为 %f。\n', approxLoop, approxVectorized);