1. 在MATLAB中使用循环结构对给定的数列A=[33,689,-705,2024,-6,29]进行升序排序。
(注意:不可以使用任何MATLAB自带的排序函数直接操作。)
% 给定数列
A = [33, 689, -705, 2024, -6, 29];
% 获取数列长度
n = length(A);
% 冒泡排序算法
for i = 1:n-1
for j = 1:n-i
if A(j) > A(j+1)
% 交换 A(j) 和 A(j+1) 的位置
temp = A(j);
A(j) = A(j+1);
A(j+1) = temp;
end
end
end
% 输出排序后的结果
disp('升序排序后的数列是:');
disp(A);
也可以使用matlab自带的 sort() 函数
A=[33,689,-705,2024,-6,29];
A=sort(A)
这里先解释一下 deg2rad() 函数,这是matlab的内置函数,可以直接使用,也可以看一下下面的实现代码。
function radians = deg2rad(degrees)
radians = degrees * (pi / 180);
end
以下是该题目的代码实现
% 定义参数
v0 = 20; % 初始速率 (m/s)
theta = 40; % 投掷角度 (度)
g = 9.81; % 重力加速度 (m/s^2)
% 将角度转化为弧度
theta_rad = deg2rad(theta);
% 计算碰撞时间
t_collision = (2 * v0 * sin(theta_rad)) / g;
% 初始化时间矢量
t = linspace(0, t_collision, 100); % 生成时间从0到t_collision的100个点
% 计算高度和速度
h = v0 * sin(theta_rad) * t - 0.5 * g * t.^2; % 高度
v_vertical = v0 * sin(theta_rad) - g * t; % 垂直速度
% 水平速度保持不变
v_horizontal = v0 * cos(theta_rad);
v_total = sqrt(v_horizontal^2 + v_vertical.^2); % 计算总速度
% 查找满足条件的时间点
index = find(h < 6 & v_total <= 16);
% 输出满足条件的时间点
if ~isempty(index)
collision_time = t(index);
disp('满足条件的碰撞时间点为:');
disp(collision_time);
else
disp('没有满足条件的碰撞时间点。');
end
% 绘制高度和速度随时间变化的图形
figure;
subplot(2, 1, 1);
plot(t, h);
xlabel('时间 (秒)');
ylabel('高度 (米)');
title('高度随时间变化');
grid on;
subplot(2, 1, 2);
plot(t, v_total);
xlabel('时间 (秒)');
ylabel('速度 (m/s)');
title('速度随时间变化');
grid on;
以下是解释绘图figure的代码
figure
:
仅使用 figure
可以创建一个新的图形窗口。
subplot(2, 1, 1)
:这个命令创建一个 2 行 1 列的图形区域,并使接下来的绘图在第一个子图中进行。- 第一个参数
2
指定区域的行数(总共 2 行)。 - 第二个参数
1
指定区域的列数(总共 1 列)。 - 第三个参数
1
指定当前活动子图的编号(这里是第一个子图)。
- 第一个参数
plot(t, h)
:绘制 t 与 h(高度)之间的关系。t
是 x 轴的数据,通常代表时间。h
是 y 轴的数据,表示对应时间的高度。- 这个命令生成一个二维曲线图,x 轴为时间,y 轴为高度。
xlabel('时间 (秒)')
:设置 x 轴的标签为“时间 (秒)”。ylabel('高度 (米)')
:设置 y 轴的标签为“高度 (米)”。title('高度随时间变化')
:给当前绘制的子图添加标题“高度随时间变化”。grid on
:打开网格线,方便查看数据点的分布和变化。- 启用网格后,图中的坐标轴将显示为网格线,增强了可读性。
3. 在MATLAB中使用一个循环确定:如果用户最初在一个银行账户中存储10000,并且在每年的年终再存储10000(银行每年支付6%的利息),那么账户上要累积1000000需要多长时间。
% 初始化变量
initialDeposit = 10000; % 初始存款
annualDeposit = 10000; % 每年存入的金额
interestRate = 0.06; % 年利率
targetAmount = 1000000; % 目标金额
currentAmount = initialDeposit; % 当前账户余额
years = 0; % 年数
% 循环计算每年存款后账户的余额
while currentAmount < targetAmount
% 每年存入金额
currentAmount = currentAmount + annualDeposit;
% 计算利息
currentAmount = currentAmount * (1 + interestRate);
% 增加年数
years = years + 1;
end
% 输出结果
disp(['达到 ' num2str(targetAmount) ' 元所需的年数: ' num2str(years)]);
4. 已知二阶代数方程ax2+bx+c=0的解为
编写一个函数function x = solveeq(a,b,c),使其给定不同的a,b,c值时可以求解该二阶代数方程的解x,并在MATLAB命令窗口中调用该函数来测试解的四种情况。
(提示:使用if-else-end结构编写。)
function x = solveeq(a, b, c)
% 检查 a 是否为零
if a == 0
error('a 不能为零。请确保 a 不为零。');
end
% 计算判别式
D = b^2 - 4*a*c;
if D > 0
% 两个不同的实根
x(1) = (-b + sqrt(D)) / (2*a);
x(2) = (-b - sqrt(D)) / (2*a);
disp(['方程有两个不同的实根: x1 = ' num2str(x(1)) ', x2 = ' num2str(x(2))]);
elseif D == 0
% 一个重根
x(1) = -b / (2*a);
disp(['方程有一个重根: x = ' num2str(x(1))]);
else
% 两个共轭复根
realPart = -b / (2*a);
imagPart = sqrt(-D) / (2*a);
x(1) = complex(realPart, imagPart);
x(2) = complex(realPart, -imagPart);
disp(['方程有两个共轭复根: x1 = ' num2str(x(1)), ', x2 = ' num2str(x(2))]);
end
end
测试代码
测试代码:
% 测试案例1: 两个不同的实根
solveeq(1, -3, 2);
% 测试案例2: 一个重根
solveeq(1, -2, 1);
% 测试案例3: 两个共轭复根
solveeq(1, 2, 5);
% 测试案例4: a = 0 (将报错)
% solveeq(0, 2, 3); % 取消注释以测试