///A 为矩阵,这里写成一维数组,如 【1】,【1,2,3,4】
function GetLU(a)
{
var n = a.length;//矩阵的总数据数目
var s = Math.sqrt(n);//矩阵的阶数
var L = new Array(n);
var U = new Array(n); if (GetDet(a) != 0)
{ var allOrderNotEqulesZero = true;
for (var i = 0; i < s; i++)
{
if (GetDet(GetOrderMatrix(a, i)) == 0)
{
allOrderNotEqulesZero = false;
break;
}
} if (allOrderNotEqulesZero) {
for (var i = 0; i < s; i++)
{
for (var j = 0; j < s; j++)
{
if (i == j)
{
L[i*s + j] = 1;
}
else if (i < j)
{
L[i*s+j] = 0;
}
if (i > j)
U[i*s+j] = 0; U[0*s+j] = a[0*s+j];
L[i*s+0] = a[i*s+0] / U[0*s+0];
}
} for (var k = 1; k < s; k++)
{ for (var j = k; j < s; j++)
{
tmp = 0;
for (var m = 0; m < k; m++)
{
tmp += L[k*s+m] * U[m*s+j];
} U[k*s+j] = a[k*s+j] - tmp;
} for (var i = k+1; i < s; i++)
{
tmp = 0;
for (var m = 0; m < k; m++)
{
tmp += L[i*s+m] * U[m*s+k];
} L[i*s+k] = ( a[i*s+k] - tmp ) / U[k*s+k];
} }
}
else
{
alert('该矩阵的顺序主子式中有零!')
console.log(GetLastMatrix(a));
for (var i = 0; i < s; i++)
{
for (var j = 0; j < s; j++)
{
if (j > i)
{
U[i * s + j] = a[i * s + j];
L[i * s + j] = 0;
}
else if (j == i)
{
U[i * s + j] = a[i * s + j];
L[i * s + j] = 1;
}
else
{
L[i * s + j] = a[i * s + j];
U[i * s + j] = 0;
}
}
}
} console.log(L);
console.log(U);
}
else
{
alert('该矩阵为奇异矩阵,无法进行LU分解!');
} } function GetDet(a)
{
var n = a.length;//矩阵的总数据数目
var s = Math.sqrt(n);//矩阵的阶数
var sum = 0;
if (n == 1)
{
return a[0];
} for (var i = 0; i < s; i++)
{
if (i % 2 == 0)
{
sum += a[i] * GetDet(GetSubMatrix(a, i))
}
else
{
sum -= a[i] * GetDet(GetSubMatrix(a, i))
}
} return sum;
} ///获取比较第n列之后的矩阵
function GetLastMatrix(a)
{
var n = a.length;//矩阵的总数据数目
var s = Math.sqrt(n);//矩阵的阶数
var p = [];
for (var i = 0; i < s; i++)
{
for (var j = 0; j < s; j++)
{
if (i == j)
{
p.push(1); }
else {
p.push(0);
}
}
} for (var i = 0; i < s -1; i++)
{
a = GetNewMatrix(a, i, p);
} console.log(p);
return a;
} function GetNewMatrix(a, k, p)
{
var n = a.length;//矩阵的总数据数目
var s = Math.sqrt(n);//矩阵的阶数
var result = [];
var maxRowNum = 0;
var MAXValue = Math.abs(a[ k * s + k]);
for (var i = 1; i < s; i++)
{
if ( i >= k && Math.abs(a[i * s + k]) > MAXValue )
{
maxRowNum = i;
MAXValue = Math.abs(a[i * s + k]);
}
} //console.log('maxRowNum:' + maxRowNum);
//console.log('MAXValue:' + MAXValue); if (maxRowNum != k)
{
for (var i = 0; i < s; i++)
{ var temp = a[k * s + i];
a[k * s + i] = a[maxRowNum * s + i]
a[maxRowNum * s + i] = temp; var tmp1 = p[k * s + i];
p[k * s + i] = p[maxRowNum * s + i]
p[maxRowNum * s + i] = tmp1;
} //console.log(a);
//console.log(p); if (MAXValue != 0)
{
for (var i = k + 1; i < s; i++)
{ if (a[i * s + k] != 0)
{
a[i * s + k] = parseFloat(a[i * s + k] / a[k * s + k])
for (var j = k + 1; j< s; j++)
{
a[i * s + j] = parseFloat(a[i * s + j]- a[i * s + k] * a[k * s + j])
}
}
}
}
}else
{
if (MAXValue != 0)
{
for (var i = k + 1; i < s; i++)
{ if (a[i * s + k] != 0)
{
a[i * s + k] = parseFloat(a[i * s + k] / a[k * s + k])
for (var j = k + 1; j< s; j++)
{
a[i * s + j] = parseFloat(a[k * s + j] - a[i * s + k] * a[i * s + j])
}
}
}
}
} //console.log(a);
return a;
} ///a为原始矩阵,k为所在的列数
function GetSubMatrix(a, k)
{
var n = a.length;//矩阵的总数据数目
var s = Math.sqrt(n);//矩阵的阶数
var result = [];
for (var i = 1; i < s; i++)
{
for (var j = 0; j < s; j++)
{
if (k != j)
{
result.push(a[i*s +j]);
}
}
} return result;
} ///获取顺序主子式的矩阵, k为阶数
function GetOrderMatrix(a, k)
{
var n = a.length;//矩阵的总数据数目
var s = Math.sqrt(n);//矩阵的阶数
var result = [];
for (var i = 0; i < s; i++)
{
for (var j = 0; j < s; j++)
{
if (i <= k && j <= k)
{
result.push(a[i*s +j]);
}
}
} return result;
}

  

LU分解,Javascript代码的更多相关文章

  1. LU分解(1)

    1/6 LU 分解          LU 分解可以写成A = LU,这里的L代表下三角矩阵,U代表上三角矩阵.对应的matlab代码如下: function[L, U] =zlu(A) % ZLU ...

  2. 新书《编写可测试的JavaScript代码 》出版,感谢支持

    本书介绍 JavaScript专业开发人员必须具备的一个技能是能够编写可测试的代码.不管是创建新应用程序,还是重写遗留代码,本书都将向你展示如何为客户端和服务器编写和维护可测试的JavaScript代 ...

  3. 如何编写可维护的面向对象JavaScript代码

    能够写出可维护的面向对象JavaScript代 码不仅可以节约金钱,还能让你很受欢迎.不信?有可能你自己或者其他什么人有一天会回来重用你的代码.如果能尽量让这个经历不那么痛苦,就可以节省不少时 间.地 ...

  4. 一行能装逼的JavaScript代码

    一行能装逼的JavaScript代码 2016-06-28 野狗 一行神奇的JS代码,当时我就震 惊了,这不就是传说中的ZB神奇么… … 哈哈. 写本篇文章的缘由是之前看到了一段js代码,如下: (! ...

  5. LU分解(2)

    接着上次LU分解的讲解,这次给出使用不同的计算LU分解的方法,这种方法称为基于GaxPy的计算方法.这里需要了解lapapck中的一些函数.lapack中有一个函数名为gaxpy,所对应的矩阵计算公式 ...

  6. 翻译 | 一行 JavaScript 代码的逆向工程

    原文地址:Reverse Engineering One Line of JavaScript 原文作者:Alex Kras 译者:李波 校对者:冬青.小萝卜 几个月前,我看到一个邮件问:有没有人可以 ...

  7. 矩阵LU分解分块算法实现

    本文主要描述实现LU分解算法过程中遇到的问题及解决方案,并给出了全部源代码. 1. 什么是LU分解? 矩阵的LU分解源于线性方程组的高斯消元过程.对于一个含有N个变量的N个线性方程组,总可以用高斯消去 ...

  8. 编程原理—如何用javascript代码解决一些问题

    关于编程,我最喜欢的就是解决问题.我不相信有谁天生具有解决问题的能力.这是一种通过反复锻炼而建立并维持的能力.像任何练习一样,有一套指导方针可以帮助你更有效地提高解决问题的能力.我将介绍5个最重要的软 ...

  9. javascript代码 调试方法

    你的代码可能包含语法错误,逻辑错误,如果没有调试工具,这些错误比较难于发现. 通常,如果 JavaScript 出现错误,是不会有提示信息,这样你就无法找到代码错误的位置. 在程序代码中寻找错误叫做代 ...

随机推荐

  1. [Latex]实现行内高亮

    Latex的行内高亮 前两天想要在做的小操作系统实验指导书里使用行内高亮,一开始虽然有命令 \mint{Language}|contents| 但是无奈只能实现跳行高亮,即不能实现行内高亮.即代码高亮 ...

  2. Scrum 项目 7.0

    ------------------7.0------------------------------ Sprint回顾 1.回顾组织 主题:“我们怎样才能在下个sprint中做的更好?” 时间:设定 ...

  3. Linq专题之集合初始化器

    集合初始化器用来初始化一个集合,和对象初始化器有点类似,都是用一对{}来初始化. using System; using System.Collections.Generic; using Syste ...

  4. 在android设备上调试ionic应用

    方法1: ionic run android -l -c 将会在console中输出日志信息 方法2: (1).使用usb连接android设备,并打开android设备的调试功能 (2).在chro ...

  5. mis导入器的加强版——vdproj文件资源浏览器

    上次做的那个导入器不够强大,限制还不小,用起来不方便.于是就再做一个这样的工具.代码基本上不同了,思想还是差不多,但功能肯定比之前的强大.经过了这次编写工具,对vdporj文件的了解又深一层了. 在v ...

  6. (转载)IO-同步、异步、阻塞、非阻塞

    一.概述 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不 ...

  7. jquery实现网页选项卡

    这个功能在现在的网站中使用较为普遍,就是以选项卡的形式来对一些内容做了分类.,比如下面的天猫商城. 下面的源码是仿照天猫写的一个选项卡,实现起来的效果如下. 主要是利用我们在点击相应板块是触发它的单击 ...

  8. 重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++

    [源码下载] 重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++ 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 其它 C# ...

  9. Spring RMI Example

    一: 提供服务的远程一端 1-1. applicationContext.xml <?xml version="1.0" encoding="UTF-8" ...

  10. 那些教程没有的php4-composer依赖管理工具

    phpcomposer PHP 5.3.2+ Composer 不是一个包管理器,但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装.默认情况下它不会在全局安装任何东西 ...