LU分解,Javascript代码
///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代码的更多相关文章
- LU分解(1)
1/6 LU 分解 LU 分解可以写成A = LU,这里的L代表下三角矩阵,U代表上三角矩阵.对应的matlab代码如下: function[L, U] =zlu(A) % ZLU ...
- 新书《编写可测试的JavaScript代码 》出版,感谢支持
本书介绍 JavaScript专业开发人员必须具备的一个技能是能够编写可测试的代码.不管是创建新应用程序,还是重写遗留代码,本书都将向你展示如何为客户端和服务器编写和维护可测试的JavaScript代 ...
- 如何编写可维护的面向对象JavaScript代码
能够写出可维护的面向对象JavaScript代 码不仅可以节约金钱,还能让你很受欢迎.不信?有可能你自己或者其他什么人有一天会回来重用你的代码.如果能尽量让这个经历不那么痛苦,就可以节省不少时 间.地 ...
- 一行能装逼的JavaScript代码
一行能装逼的JavaScript代码 2016-06-28 野狗 一行神奇的JS代码,当时我就震 惊了,这不就是传说中的ZB神奇么… … 哈哈. 写本篇文章的缘由是之前看到了一段js代码,如下: (! ...
- LU分解(2)
接着上次LU分解的讲解,这次给出使用不同的计算LU分解的方法,这种方法称为基于GaxPy的计算方法.这里需要了解lapapck中的一些函数.lapack中有一个函数名为gaxpy,所对应的矩阵计算公式 ...
- 翻译 | 一行 JavaScript 代码的逆向工程
原文地址:Reverse Engineering One Line of JavaScript 原文作者:Alex Kras 译者:李波 校对者:冬青.小萝卜 几个月前,我看到一个邮件问:有没有人可以 ...
- 矩阵LU分解分块算法实现
本文主要描述实现LU分解算法过程中遇到的问题及解决方案,并给出了全部源代码. 1. 什么是LU分解? 矩阵的LU分解源于线性方程组的高斯消元过程.对于一个含有N个变量的N个线性方程组,总可以用高斯消去 ...
- 编程原理—如何用javascript代码解决一些问题
关于编程,我最喜欢的就是解决问题.我不相信有谁天生具有解决问题的能力.这是一种通过反复锻炼而建立并维持的能力.像任何练习一样,有一套指导方针可以帮助你更有效地提高解决问题的能力.我将介绍5个最重要的软 ...
- javascript代码 调试方法
你的代码可能包含语法错误,逻辑错误,如果没有调试工具,这些错误比较难于发现. 通常,如果 JavaScript 出现错误,是不会有提示信息,这样你就无法找到代码错误的位置. 在程序代码中寻找错误叫做代 ...
随机推荐
- Windows平台下ActiveMQ 安装
安装之前需要先确定机器上已经有JVM环境,如果没有则会在安装过程中提示 Unable to execute Java command. 系统找不到指定的文件 第一步:从官网下载ActiveMQ的安装 ...
- BZOJ1087状压DP 解题报告
1087: [SCOI2005]互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的 ...
- 一次领域驱动设计(DDD)的实际应用
笔者先前参与了一个有关汽车信息的网站开发,用于显示不同品牌的汽车的信息,包括车型,发动机型号,车身尺寸和汽车报价等信息.在建模时,我们只需要创建名为Car的实体(Entity)对象.其他的信息,比如车 ...
- Web 前端性能优化准则
准则01:尽量减少http请求 “只有10%-20%的最终用户响应时间花在接收请求的HTML文档上,剩下的80%-90%时间花在HTML文档所引用的所有组件(图片,script,css,flash等等 ...
- Android读写SD卡
SD卡的读写是我们在开发Android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String sdCardRoot = Environment.getEx ...
- 【C++】第1章 在VS2015中用C++编写控制台应用程序
分类:C++.VS2015 创建日期:2016-06-12 一.简介 看到不少人至今还在用VC 6.0开发工具学习C++,其实VC 6.0开发工具早就被淘汰了.这里仅介绍学习C++时推荐使用的两种开发 ...
- R语言-简单线性回归图-方法
目标:利用R语言统计描绘50组实验对比结果 第一步:导入.csv文件 X <- read.table("D:abc11.csv",header = TRUE, sep = & ...
- 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片
[源码下载] 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片 作者:webabcd 介绍与众不同 windows pho ...
- cURL POST command line on WINDOWS RESTful service
26down votefavorite 7 My problem: Running windows 7 and using the executable command line tool to cu ...
- maven oracle jdbc jar
1.problem describe: when your dependency jar about oracle use code like this: <!-- oracle-connect ...