JS求解三元一次方程组值的方法


Posted in Javascript onJanuary 03, 2017

本文实例讲述了JS求解三元一次方程组值的方法。分享给大家供大家参考,具体如下:

// 求用js 码一段代码求 三元一次方程组的值!
// a1 = y * b1 + z * c1 - d1 * x; (1)
// a2 = y * b2 + z * c2 - d2 * x; (2)
// a3 = y * b3 + z * c3 - d3 * x; (3)
// (1) - (2)
// a1 - a2 = y * (c1 - c2) + z * (d1 - d2)  (4)
// (1) - (3)
// a1 - a3 = y * (c1 - c3) + z * (d1 - d3)  (5)
// (4) * (c1 - c3)/(c1 - c2)
// (a1 - a2) * ((c1 - c3)/(c1 - c2)) = y * (c1 - c3) + z * (d1 - d2) * ((c1 - c3)/(c1 - c2));  (6)
// (6) - (5)
// (a1 - a2) * ((c1 - c3)/(c1 - c2)) - (a1 - a3) = z * ((d1 - d2) * ((c1 - c3)/(c1 - c2)) - (d1 - d3));  (7)
//
//==================================================================================================
// (1) * (d2/d1)
// ( a1 * (d2/d1) ) = y * b1 * (d2/d1) + z * c1 * (d2/d1) - d1 * x * (d2/d1)  (4)
// ( a1 * (d2/d1) ) = y * b1 * (d2/d1) + z * c1 * (d2/d1) - d2 * x       (4.1)
// (4.1) - (2)
// ( ( a1 * (d2/d1) ) - a2 ) = y * ( (b1 * (d2/d1)) - b2 ) + z * ( (c1 * (d2/d1)) - c2 );  (5)
// (1) * (d3/d1)
// ( a1 * (d3/d1) ) = y * ( b1 * (d3/d1) ) + z * ( c1 * (d3/d1) ) - d1 * x * (d3/d1)  (6)
// ( a1 * (d3/d1) ) = y * ( b1 * (d3/d1) ) + z * ( c1 * (d3/d1) ) - d3 * x       (6.1)
// (6.1) - (3)
// ( ( a1 * (d3/d1) ) - a3 ) = y * ( ( b1 * (d3/d1) ) - b3 ) + z * ( ( c1 * (d3/d1) ) - c3 )  (7)
// (5) * ( ( (b1 * (d3/d1)) - b3 ) / ( ( b1 * (d2/d1) ) - b2 ) )
// ( ( ( a1 * (d2/d1) ) - a2 ) * ( ( (b1 * (d3/d1)) - b3 ) / ( ( b1 * (d2/d1) ) - b2 ) ) ) = y * ( (b1 * (d3/d1)) - b3 ) + z * ( ( (c1 * (d2/d1)) - c2 ) * ( ( (b1 * (d3/d1)) - b3 ) / ( ( b1 * (d2/d1) ) - b2 ) ) )  (8)
// (8) - (7)
// ( ( ( ( a1 * (d2/d1) ) - a2 ) * ( ( (b1 * (d3/d1)) - b3 ) / ( ( b1 * (d2/d1) ) - b2 ) ) ) - ( ( a1 * (d3/d1) ) - a3 ) )
// =
// z * ( ( ( (c1 * (d2/d1)) - c2 ) * ( ( (b1 * (d3/d1)) - b3 ) / ( ( b1 * (d2/d1) ) - b2 ) ) ) - ( ( c1 * (d3/d1) ) - c3 ) )
//var a1 = 41778.58102, a2 = 60925.87223, a3 = 88229.03849,
//b1 = 72931.77839, b2 = 61296.01212, b3 = 67138.30916,
//c1 = 120.1318412, c2 = 120.1308286, c3 = 120.1573771,
//d1 = 30.27345376, d2 = 30.30174637, d3 = 30.32151101;
//var a1 = 1, a2 = -9, a3 = -3,
//b1 = -1, b2 = 3, b3 = -3,
//c1 = 1, c2 = -2, c3 = -5,
//d1 = -2, d2 = -1, d3 = -4;
var a1 = 11, a2 = 0, a3 = -2,
b1 = 3, b2 = 1, b3 = -1,
c1 = 1, c2 = 1, c3 = -1,
d1 = -2, d2 = -1, d3 = -3;
var equations = [
  "a1 = y * b1 + z * c1 - d1 * x",
  "a2 = y * b2 + z * c2 - d2 * x",
  "a3 = y * b3 + z * c3 - d3 * x"
];
for (var i = 0; i < equations.length; i++) {
  equations[i] = equations[i].replace("a1", "(" + a1 + ")").replace("b1", "(" + b1 + ")").replace("c1", "(" + c1 + ")").replace("d1", "(" + d1 + ")")
  .replace("a2", "(" + a2 + ")").replace("b2", "(" + b2 + ")").replace("c2", "(" + c2 + ")").replace("d2", "(" + d2 + ")")
  .replace("a3", "(" + a3 + ")").replace("b3", "(" + b3 + ")").replace("c3", "(" + c3 + ")").replace("d3", "(" + d3 + ")");
}
console.log(equations);
// 计算三元一次方程
// 确保常量和未知数分开在2边,逻辑安装这样处理的
var LEquat = {
  formatFloat: function(f, digit) {
    var m = Math.pow(10, digit);
    return parseInt(f * m, 10) / m;
  },
  // 是否常量一边, 返回0常量的一边索引,1变量一边的索引,返回一个数组
  separateSide: function(equations) {
    var arr = [], equa = equations.split("=");
    if (equa[0].search(/x|y|z/) == -1) {
      arr = equa.slice(0);
    } else {
      arr[0] = equa[1];
      arr[1] = equa[0];
    }
    return arr;
  },
  // 分隔变量的一边,把x,y,z分隔
  // x 是索引0,y是索引1,z是索引2
  separateVariableSide: function(variableSide) {
    var variables = variableSide.split(/\s+(\+|\-)\s+/);
    var arr = [];
    for (var i = 0; i < variables.length; i++) {
      if (variables[i].search(/x/) != -1) {
        arr[0] = variables[i];
      } else if (variables[i].search(/y/) != -1) {
        arr[1] = variables[i];
      } else if (variables[i].search(/z/) != -1) {
        arr[2] = variables[i];
      }
    }
    return arr;
  },
  // 取出方程里面变量一边对应x,y,z的常量系数
  // 0: x的系数,1:y的系数,2:z的系数
  getCoefficient: function(variableSideArray) {
    var me = LEquat;
    var arr = [];
    for (var i = 0; i < variableSideArray.length; i++) {
      var coeffs = variableSideArray[i].split("*");
      if (coeffs[0].search(/x|y|z/) == -1) {
        arr[i] = coeffs[0];
      } else {
        arr[i] = coeffs[1];
      }
    }
    return arr;
  },
  step: function() {
    var me = LEquat;
    // 分隔第一个方程
    var equation1 = me.separateSide(equations[0]);
    // 分隔第二个方程
    var equation2 = me.separateSide(equations[1]);
    // 分隔第三个方程
    var equation3 = me.separateSide(equations[2]);
    // 第一个方程的常量一边
    var a1 = equation1[0];
    // 第一个方程x系数
    var equa1 = me.getCoefficient(me.separateVariableSide(equation1[1]));
    // y的系数     z的系数     x的系数
    var b1 = equa1[1], c1 = equa1[2], d1 = equa1[0];
    // 第二个方程的常量一边
    var a2 = equation2[0];
    // 第二个方程变量一边系数
    var equa2 = me.getCoefficient(me.separateVariableSide(equation2[1]));
    var b2 = equa2[1], c2 = equa2[2], d2 = equa2[0];
    // 第三个方程的常量一边
    var a3 = equation3[0];
    // 第三个方程变量一边系数
    var equa3 = me.getCoefficient(me.separateVariableSide(equation3[1]));
    var b3 = equa3[1], c3 = equa3[2], d3 = equa3[0];
    // ( a1 * (d2/d1) )
    var left4_1 = " ( " + a1 + " * ( " + d2 + " / " + d1 + " ) ) ";
    // (4.1) 右边
    var right4_1 = " y " + " * " + b1 + " * ( " + d2 + " / " + d1 + " ) + z * " + c1 + " * ( " + d2 + " / " + d1 + " ) - " + d2 + " * x ";
    // 消x (4.1) - (2)
    // ( ( a1 * (d2/d1) ) - a2 ) = y * ( (b1 * (d2/d1)) - b2 ) + z * ( (c1 * (d2/d1)) - c2 );  (5)
    // (5) 中常量的一边
    var left5_1 = " ( " + left4_1 + " - " + a2 + " ) ";
    // (5) 中变量一边
    var right5_1 = " y * ( ( " + b1 + " * ( " + d2 + " / " + d1 + " ) ) - " + b2 + " ) + z * ( ( " + c1 + " * ( " + d2 + " / " + d1 + " ) ) - " + c2 + " ) ";
    // (1) * (d3/d1)
    // ( a1 * (d3/d1) ) = y * ( b1 * (d3/d1) ) + z * ( c1 * (d3/d1) ) - d1 * x * (d3/d1)  (6)
    // ( a1 * (d3/d1) ) = y * ( b1 * (d3/d1) ) + z * ( c1 * (d3/d1) ) - d3 * x       (6.1)
    var left6_1 = " ( " + a1 + " * ( " + d3 + " / " + d1 + " ) ) ";
    var right6_1 = " y * ( " + b1 + " * ( " + d3 + " / " + d1 + " ) ) + z * ( " + c1 + " * ( " + d3 + " / " + d1 + " ) ) - " + d3 + " * x ";
    // (6.1) - (3)
    // ( ( a1 * (d3/d1) ) - a3 ) = y * ( ( b1 * (d3/d1) ) - b3 ) + z * ( ( c1 * (d3/d1) ) - c3 )  (7)
    var left7_1 = " ( " + left6_1 + " - " + a3 + " ) ";
    var right7_1 = " y * ( ( " + b1 + " * ( " + d3 + " / " + d1 + " ) ) - " + b3 + " ) + z * ( ( " + c1 + " * ( " + d3 + " / " + d1 + " ) ) - " + c3 + " ) ";
    // (5) * ( ( (b1 * (d3/d1)) - b3 ) / ( ( b1 * (d2/d1) ) - b2 ) )
    // ( ( ( a1 * (d2/d1) ) - a2 ) * ( ( (b1 * (d3/d1)) - b3 ) / ( ( b1 * (d2/d1) ) - b2 ) ) )
    // = y * ( (b1 * (d3/d1)) - b3 ) + z * ( ( (c1 * (d2/d1)) - c2 ) * ( ( (b1 * (d3/d1)) - b3 ) / ( ( b1 * (d2/d1) ) - b2 ) ) )  (8)
    var left8_1 = " ( " + left5_1 + " * ( ( ( " + b1 + " * ( " + d3 + " / " + d1 + " ) ) - " + b3 + " ) / ( ( " + b1 + " * ( " + d2 + " / " + d1 + " ) ) - " + b2 + " ) ) ) ";
    var right8_1 = " y * ( ( " + b1 + " * ( " + d3 + " / " + d1 + " ) ) - " + b3 + " ) + z * ( ( ( " + c1 + " * ( " + d2 + " / " + d1 + " ) ) - " + c2 + " ) * ( ( ( " + b1 + " * ( " + d3 + " / " + d1 + " ) ) - " + b3 + " ) / ( ( " + b1 + " * ( " + d2 + " / " + d1 + " ) ) - " + b2 + " ) ) ) ";
    // (8) - (7)
    // ( ( ( ( a1 * (d2/d1) ) - a2 ) * ( ( (b1 * (d3/d1)) - b3 ) / ( ( b1 * (d2/d1) ) - b2 ) ) ) - ( ( a1 * (d3/d1) ) - a3 ) )
    // =
    // z * ( ( ( (c1 * (d2/d1)) - c2 ) * ( ( (b1 * (d3/d1)) - b3 ) / ( ( b1 * (d2/d1) ) - b2 ) ) ) - ( ( c1 * (d3/d1) ) - c3 ) )  (9)
    var left9_1 = " ( " + left8_1 + " - " + left7_1 + " ) ";
    var right9_1 = " z * ( ( ( ( " + c1 + " * ( " + d2 + " / " + d1 + " ) ) - " + c2 + " ) * ( ( ( " + b1 + " * ( " + d3 + " / " + d1 + " ) ) - " + b3 + " ) / ( ( " + b1 + " * ( " + d2 + " / " + d1 + " ) ) - " + b2 + " ) ) ) - ( ( " + c1 + " * ( " + d3 + " / " + d1 + " ) ) - " + c3 + " ) ) ";
    var z = left9_1 + " / " + " ( ( ( ( " + c1 + " * ( " + d2 + " / " + d1 + " ) ) - " + c2 + " ) * ( ( ( " + b1 + " * ( " + d3 + " / " + d1 + " ) ) - " + b3 + " ) / ( ( " + b1 + " * ( " + d2 + " / " + d1 + " ) ) - " + b2 + " ) ) ) - ( ( " + c1 + " * ( " + d3 + " / " + d1 + " ) ) - " + c3 + " ) ) ";
    // ( ( a1 * (d2/d1) ) - a2 ) = y * ( (b1 * (d2/d1)) - b2 ) + z * ( (c1 * (d2/d1)) - c2 );
    var y = " ( " + left5_1 + " - " + " z * ( ( " + c1 + " * ( " + d2 + " / " + d1 + " ) ) - " + c2 + " ) ) " + " / " + " ( ( " + b1 + " * ( " + d2 + " / " + d1 + " ) ) - " + b2 + " ) ";
    // 把z代入到(5)中
    y = y.replace("z", z);
    // 把y,z代入方程1
    // a1 = y * b1 + z * c1 - d1 * x
    var x = " ( y * " + b1 + " + z * " + c1 + " - " + a1 + " ) / " + d1;
    x = x.replace("z", z).replace("y", y);
    x = me.formatFloat(eval(x), 2);
    y = me.formatFloat(eval(y), 2);
    z = me.formatFloat(eval(z), 2);
    return {x: x,y: y,z: z};
  }
};
console.log("-----------计算结果--------------");
console.log(LEquat.step());

PS:这里再为大家推荐几款计算工具供大家进一步参考借鉴:

在线一元函数(方程)求解计算工具:
http://tools.3water.com/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.3water.com/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.3water.com/jisuanqi/jsq

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
seaJs的模块定义和模块加载浅析
Jun 06 Javascript
JavaScript显示表单内元素数量的方法
Apr 02 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
Sep 26 Javascript
移动端日期插件Mobiscroll.js使用详解
Dec 19 Javascript
基于BootStrap的前端分页带省略号和上下页效果
May 18 Javascript
JS SetInterval 代码实现页面轮询
Aug 11 Javascript
Angular自定义组件实现数据双向数据绑定的实例
Dec 11 Javascript
jQuery动态移除与增加onclick属性的方法详解
Jun 07 jQuery
使用jquery DataTable和ajax向页面显示数据列表的方法
Aug 09 jQuery
Vue 框架之键盘事件、健值修饰符、双向数据绑定
Nov 14 Javascript
vue2 中二级路由高亮问题及配置方法
Jun 10 Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 Javascript
Vue.js系列之项目结构说明(2)
Jan 03 #Javascript
Vue.js系列之项目搭建(1)
Jan 03 #Javascript
jquery实现下拉框多选方法介绍
Jan 03 #Javascript
jQuery实现可拖拽3D万花筒旋转特效
Jan 03 #Javascript
详解JavaScript常量定义
Jan 03 #Javascript
两种简单的跨域方法(jsonp、php)
Jan 02 #Javascript
JavaScript实现图片瀑布流和底部刷新
Jan 02 #Javascript
You might like
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
基于php无限分类的深入理解
2013/06/02 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
JS获取url参数、主域名的方法实例分析
2016/08/03 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
python 不关闭控制台的实现方法
2011/10/23 Python
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
Python3实现连接SQLite数据库的方法
2014/08/23 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
Python常见数字运算操作实例小结
2019/03/22 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
Python谱减法语音降噪实例
2019/12/18 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
Python中return函数返回值实例用法
2020/11/19 Python
Django数据统计功能count()的使用
2020/11/30 Python
python math模块的基本使用教程
2021/01/16 Python
Joules美国官网:出色的英国风格
2017/10/30 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
EntityManager都有哪些方法
2013/11/01 面试题
证券期货行业个人的自我评价
2013/12/26 职场文书
cf收人广告词
2014/03/14 职场文书
授权委托书样本
2014/09/25 职场文书
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
Python函数中apply、map、applymap的区别
2021/11/27 Python