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 相关文章推荐
用javascript动态调整iframe高度的代码
Apr 10 Javascript
JQuery 图片延迟加载并等比缩放插件
Nov 09 Javascript
javascript innerHTML使用分析
Dec 03 Javascript
jQuery中:empty选择器用法实例
Dec 30 Javascript
Three.js学习之网格
Aug 10 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
Dec 12 Javascript
vue组件学习教程
Sep 09 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
Mar 09 Javascript
解决element ui select下拉框不回显数据问题的解决
Feb 20 Javascript
JS实现动态添加外部js、css到head标签的方法
Jun 05 Javascript
解决Vue动态加载本地图片问题
Oct 09 Javascript
jQuery实现图片切换效果
Oct 19 jQuery
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内存使用情况如何获取
2015/10/10 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
React如何避免重渲染
2018/04/10 Javascript
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
Python实现的Kmeans++算法实例
2014/04/26 Python
Python去除字符串两端空格的方法
2015/05/21 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
企业给企业的表扬信
2014/01/13 职场文书
九年级数学教学反思
2014/02/02 职场文书
模范教师事迹材料
2014/02/10 职场文书
公路绿化方案
2014/05/12 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
2014年公务员工作总结
2014/11/18 职场文书
学校中秋节活动总结
2015/03/23 职场文书
《鲸》教学反思
2016/02/23 职场文书