实验3 MATLAB程序设计与优化

一、实验的目的与要求

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值