第一次作业参考答案

第一题

clear
data = xlsread('data.xlsx');
dataUS = data(:, [1, 2]);
dataChina = data(:, [1, 3]);
% 除去 NaN
ifNan = isnan(dataChina);
dataChina = dataChina(~ifNan(:, 2), :);

% 插值
xiUS = linspace(dataUS(1, 1), dataUS(end, 1), 500);
yiUS = interp1(dataUS(:, 1), dataUS(:, 2), xiUS, 'pchip');
xiChina = linspace(dataChina(1, 1), dataChina(end, 1), 500);
yiChina = interp1(dataChina(:, 1), dataChina(:, 2), xiChina, 'pchip');

% 画图
plot(xiUS, yiUS, 'b-')
hold on
plot(xiChina, yiChina, 'r-')
plot(dataUS(:, 1), dataUS(:, 2), 'bx');
plot(dataChina(:, 1), dataChina(:, 2), 'rx')

% 注释
xlabel('年份 / 年', 'FontSize', 16);
ylabel('人口数 / 百万', 'FontSize', 16)
legend('美国人口', '中国人口', 'Location', 'northwest')
title('美国人口与中国人口变化图', 'FontSize', 16)

第二题

  • rref 函数可以将增广矩阵化为标准阶梯型。可以说根据这个矩阵就可以看出来解了。用rref 处理后的结果如图:

  • 为了练习基本操作,我们写一段代码,来根据标准阶梯型把答案打印出来。

clear
% 输入增广矩阵
B_1 = [2 3 -1 5 0; 3 1 2 -7 0; 4 1 -3 6 0; 1 -2 4 -7 0];
B_2 = [3 4 -5 7 0; 2 -3 3 -2 0; 4 11 -13 16 0; 7 -2 1 3 0];
B_3 = [4 2 -1 2; 3 -1 2 10; 11 3 0 8];
B_4 = [2 1 -1 1 1; 4 2 -2 1 2; 2 1 -1 -1 1];

solveLinearEquation(B_1);
solveLinearEquation(B_2);
solveLinearEquation(B_3);
solveLinearEquation(B_4);

function solveLinearEquation(B)
    % 化为阶梯矩阵
    B = rref(B);
    % 分开增广矩阵,方便后续操作
    A = B(:, 1:end-1);
    C = B(:, end);
    % 获取 A 行数和列数
    [rowNum, columnNum] = size(A);
    
    % 唯一解条件
    if rowNum == columnNum
        if det(A) ~= 0
            disp('有唯一解')
            for index = 1:length(C)
                disp(['X', num2str(index), ' = ', num2str(C(index))])
            end
            return
        end
    end
    
    % 无解条件
    flag = sum(A .* A, 2);
    if sum(C(flag == 0) .^ 2) ~= 0
        disp('无解')
        return
    end
    
    % 多解情况
    disp('有多解')
    % A 的非全零行
    for rowIndex = (find(flag))'
        % 为方便输出正负号规范,好看,就遍历了
        ifFirstNotZero = true;
        for columnIndex = 1:columnNum
            thisNumber = A(rowIndex, columnIndex);
            if thisNumber ~= 0
                % 第一个非零
                if ifFirstNotZero
                    ifFirstNotZero = false;
                    fprintf('X%d = %f', columnIndex, C(rowIndex))
                    continue
                end
                % 后面的非零
                if thisNumber > 0
                    fprintf(' - %f X%d', thisNumber, columnIndex)
                    continue
                end
                fprintf(' + %f X%d', abs(thisNumber), columnIndex)
            end
        end
        fprintf('\n')
    end
end


本文章使用limfx的vsocde插件快速发布