【问题标题】:NURBS: Where can I find these two Linear Algebra utility functions?NURBS:我在哪里可以找到这两个线性代数效用函数?
【发布时间】:2018-06-02 07:17:50
【问题描述】:

我正在阅读 Piegl 和 Tiller 的 The NURBS Book。对于全局插值算法,它们要求您提供两个实用程序来求解线性方程组:

LUDecomposition(A, q, sbw) 将具有半带宽sbwq x q 系数矩阵分解为上下三角分量;为简单起见,我们假设A 是一个q x q 方阵,但应该使用一个只存储非零波段的实用程序。

ForwardBackward(A, q, sbw, rhs, sol) 执行前向/后向替换(参见 [Press88]); rhs[] 是系统的右手边(Q_k 的坐标),sol[] 是解向量(P_i 的坐标)。

查看参考Press88,我发现它是C中的数字食谱。我应该能够修改那本书中的算法以获得ForwardBackward 函数,但就LUDecomposition 而言,我在哪里可以找到适用于对角带矩阵的特殊情况的算法?

【问题讨论】:

  • 澄清一下,A 被假定为tridiagonal?
  • 我相信它们是对角线但不一定是三对角线。因此规定了半带宽。
  • 是的,您是对的,感谢您的澄清。

标签: linear-algebra matrix-decomposition


【解决方案1】:

Tridiagonal matrix 的 LU 反编译的 Matlab 代码

 function [u1,d1,l1] = decomt(u,d,l)
    %length of diagonal
    n=length(d);
    u1=u;
    d1 = d;
    l1=l;

    %perform LU decomp

    d1(1) = d(1);
    for i =2:n
        l1(i-1) = l(i-1)/d1(i-1); %update lower triangle
        d1(i)= d(i) - (l(i-1)/d1(i-1))*u(i-1); % update diagonal
    end
    end

为了解决,前子后子。

function [x] = solvet(u,d,l,b) 

n=length(d);
x = (1:n);
y =(1:n);

% Solve tridiag LUx=b

% Step 1 Solve Ly=b for y

y(1) = b(1)

for i=2:n
    y(i) = b(i) - l(i-1)*y(i-1);
end

%Step 2 : Solve Ux=y for x
x(n) = y(n)/d(n);
for i=(n-1):-1:1
    x(i) = (y(i)-u(i)*x(i+1))/d(i);
end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多