JS求解三元一次方程组值的方法
本文实例讲述了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))
//vara1=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;
//vara1=1,a2=-9,a3=-3,
//b1=-1,b2=3,b3=-3,
//c1=1,c2=-2,c3=-5,
//d1=-2,d2=-1,d3=-4;
vara1=11,a2=0,a3=-2,
b1=3,b2=1,b3=-1,
c1=1,c2=1,c3=-1,
d1=-2,d2=-1,d3=-3;
varequations=[
"a1=y*b1+z*c1-d1*x",
"a2=y*b2+z*c2-d2*x",
"a3=y*b3+z*c3-d3*x"
];
for(vari=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边,逻辑安装这样处理的
varLEquat={
formatFloat:function(f,digit){
varm=Math.pow(10,digit);
returnparseInt(f*m,10)/m;
},
//是否常量一边,返回0常量的一边索引,1变量一边的索引,返回一个数组
separateSide:function(equations){
vararr=[],equa=equations.split("=");
if(equa[0].search(/x|y|z/)==-1){
arr=equa.slice(0);
}else{
arr[0]=equa[1];
arr[1]=equa[0];
}
returnarr;
},
//分隔变量的一边,把x,y,z分隔
//x是索引0,y是索引1,z是索引2
separateVariableSide:function(variableSide){
varvariables=variableSide.split(/\s+(\+|\-)\s+/);
vararr=[];
for(vari=0;i<variables.length;i++){
if(variables[i].search(/x/)!=-1){
arr[0]=variables[i];
}elseif(variables[i].search(/y/)!=-1){
arr[1]=variables[i];
}elseif(variables[i].search(/z/)!=-1){
arr[2]=variables[i];
}
}
returnarr;
},
//取出方程里面变量一边对应x,y,z的常量系数
//0:x的系数,1:y的系数,2:z的系数
getCoefficient:function(variableSideArray){
varme=LEquat;
vararr=[];
for(vari=0;i<variableSideArray.length;i++){
varcoeffs=variableSideArray[i].split("*");
if(coeffs[0].search(/x|y|z/)==-1){
arr[i]=coeffs[0];
}else{
arr[i]=coeffs[1];
}
}
returnarr;
},
step:function(){
varme=LEquat;
//分隔第一个方程
varequation1=me.separateSide(equations[0]);
//分隔第二个方程
varequation2=me.separateSide(equations[1]);
//分隔第三个方程
varequation3=me.separateSide(equations[2]);
//第一个方程的常量一边
vara1=equation1[0];
//第一个方程x系数
varequa1=me.getCoefficient(me.separateVariableSide(equation1[1]));
//y的系数z的系数x的系数
varb1=equa1[1],c1=equa1[2],d1=equa1[0];
//第二个方程的常量一边
vara2=equation2[0];
//第二个方程变量一边系数
varequa2=me.getCoefficient(me.separateVariableSide(equation2[1]));
varb2=equa2[1],c2=equa2[2],d2=equa2[0];
//第三个方程的常量一边
vara3=equation3[0];
//第三个方程变量一边系数
varequa3=me.getCoefficient(me.separateVariableSide(equation3[1]));
varb3=equa3[1],c3=equa3[2],d3=equa3[0];
//(a1*(d2/d1))
varleft4_1="("+a1+"*("+d2+"/"+d1+"))";
//(4.1)右边
varright4_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)中常量的一边
varleft5_1="("+left4_1+"-"+a2+")";
//(5)中变量一边
varright5_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)
varleft6_1="("+a1+"*("+d3+"/"+d1+"))";
varright6_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)
varleft7_1="("+left6_1+"-"+a3+")";
varright7_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)
varleft8_1="("+left5_1+"*((("+b1+"*("+d3+"/"+d1+"))-"+b3+")/(("+b1+"*("+d2+"/"+d1+"))-"+b2+")))";
varright8_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)
varleft9_1="("+left8_1+"-"+left7_1+")";
varright9_1="z*(((("+c1+"*("+d2+"/"+d1+"))-"+c2+")*((("+b1+"*("+d3+"/"+d1+"))-"+b3+")/(("+b1+"*("+d2+"/"+d1+"))-"+b2+")))-(("+c1+"*("+d3+"/"+d1+"))-"+c3+"))";
varz=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);
vary="("+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
varx="(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.jb51.net/jisuanqi/equ_jisuanqi
科学计算器在线使用_高级计算器在线计算:
http://tools.jb51.net/jisuanqi/jsqkexue
在线计算器_标准计算器:
http://tools.jb51.net/jisuanqi/jsq
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript数组操作技巧总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。