没什么好说的,最简单的图,没有之一。为了让曲线变得更加顺滑,而不是一段一段的,我们往已知数据里面插值,不会插值的可以看这里:
https://limfx.pro/readarticle/de870687-21fe-49cc-94e7-2b967458d61d
用到了逻辑数组筛选,不会的看这里:
https://limfx.pro/readarticle/e77e2223-6560-4513-87ce-f4ff4a318ec0/false
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插件快速发布