测量七次-切一次,或在实践中使用俗语

我坐在Coursera课程上。该课程面向Java初学者,在其中一个视频教程中,提出了主题7解决问题的步骤

很清楚地听了视频教程,对自己说,这项业务已经发展了很长时间。

课程的其余部分很轻松,轻松。但是,在大学的其中一门学科上,即所谓的“科学编程”中,出现了以下任务:
解决线性方程组 Ax=b使用以下矩阵扩展 A

A=LU,

哪里 L是下三角矩阵,并且 U是上三角矩阵。

线性代数的主题,我们在第一门课上讲过。坦率地说,我记得矩阵,向量和圣物的一般运算原理-高斯方法。如果您认真思考,那么我们还没有研究过LU分解,但是“ google”方法总是有帮助的。救援,到此为止。

我找到了找到矩阵的通用算法 LU,但是凌晨三点半,没有咖啡给了我适当实施的机会(假设我们在Octave上进行了编码)。最后,我吓了一跳,决定还是听一听这个巧妙命名的谚语。

1.手工描述问题


您一生所缺乏的只是了解真正的问题所在。让我们以上述问题为例,将其写在纸上。以良好的方式,必须满足以下条件才能存在矩阵LU

-逆矩阵必须存在A, 我的意思是 A1;
-所有主要未成年人都不应堕落,也就是说Δ(1,...,n)0

嗯,这就是为什么我们至少需要一个“傻瓜测试”,因为肯定有聪明的人想要使用不适合我们的矩阵。但是现在,我们忽略它。

对我们来说,问题很明显:找到矩阵LU在上述条件下 尝试搜索解决方案的方法后,不太可能第一次就能正确实现算法(如果您不擅长线性代数)。经过无数次尝试之后,我们很可能会制定出一系列解决问题的措施,然后继续执行步骤2。

2.描述你做了什么


以矩阵为例

A=(123024110).



现在,我们对其应用高斯方法,并从第三行中减去第一行,然后乘以3行的第一个元素与1行的第一个元素的比率,从而摆脱第三行中不必要的元素:

a3=a3a1a31a11.



现在,通过类似的操作摆脱3行的第二个元素:

a3=a3a2a32a22.



结果,我们得到矩阵

A=(123024000)=U.



现在,我们找到的系数(元素比例的结果 aijajj)取矩阵的值 L,并得到

L=(1000101121).



浏览模板,不是吗?

3.寻找模式


在这一阶段,很可能您将返回步骤1和2,因为并非总是找到的模板在所有情况下都是正确的。但是什么也没有,因为它没有解决,所以接下来会发生。

因此,基于一个示例,我们可以制定以下算法/解决方案模板:

1.定义一个方矩阵A,n顺序
2.设置矩阵L=I哪里 I-身份矩阵 n顺序
3.设置矩阵U=A;
4.我们对矩阵应用以下连续变换,条件是{i=2,,nj=1,,i

lij=uijujjui=uiujlij,



n=3我们得到:

L=(100l2110l31l321),U=(u11u12u130u22u2300u33)



4.检查模板/算法


有一个算法-有数百万个矩阵可以对其进行测试!您不必担心此模板,它显然是正确的(在可能的矩阵的最简类上进行了个人测试)。但是请记住:快点-你会让别人发笑因此,请始终检查您创建的模板,以免您一开始就不该继续跳下去。

5.将算法转换为代码


显而易见的一步是,您所需的一切通常已经在该语言的语法中,如果没有,那么没有人会费心创建类和函数来解决此问题,那么您就有了一种算法。由于我将这种算法作为大学教育计划的一部分实施,因此我只能使用Octave进行实施,因此我呈现给您的所有代码都是其语法(它与Python非常相似,因此我将使用其突出显示格式):

A = input("Enter the matrix A: ")
numOfRows = size(A, 1)
numOfCols = size(A, 2)

if numOfRows ~= numOfCols
    disp("Wrong matrix.")
else
    n = numOfCols
    disp("----------------")
    L = eye(3)
    disp("Making U = A")
    U = A
    disp("----------------")

    for i=2:n
        disp("Step "), disp(i-1)
        for j=1:i-1
            L(i,j) = U(i,j)/U(j,j)
            U(i,:) = U(i,:) - U(j,:)*L(i,j)
        end
        disp("----------------")
    end

    disp("Check the answer of L*U: "), disp(L*U)
end

6.搜索失败的测试


您应该始终尝试“破坏”您的代码。这里(显然)没有完全的“免于傻瓜的保护”,但我以引入初始正确矩阵的假设为基础。

在此步骤中,您应该在代码中找到所有可能的错误和不准确之处,由此也可能揭示所构造算法的偏差。因此,在这里您应该尝试尽可能多的遗漏。

7.调试失败的测试


这些步骤中最合乎逻辑且可能是预期的。该代码必须是有偏见的,并且算法必须更正。这里没有其他要添加的内容。

结论


我可以说,即使不是为了我的困倦状态,我也不太可能认真地采用这种方法来解决问题。但是值得一提的是这种方法-它很短,并且所有的工作量仅在于必须使用它的事实。

注意


感谢线性代数教科书作为解决问题的材料。

All Articles