引子
上初中的时候,解二元一次方程组是常做的题型,经常练习解方程。但是自从工作当了程序员之后,使用编程基本上就是在做web之类的需求。昨天下午看到老家的侄子的暑假作业里面有方程组,尝试了下编程来解方程组,哈哈。
首先给出一个方程组例子
2x + 5y = 26
3x + 7y = 37
初中解方程有两种算法,一种是代入消元法,一种是加减消元法。我们采用加减消元法来解方程。
定义数据结构
首先,我们定义下方程的数据结构,比如上面的两个方程定义如下:
// 第一个方程
const a ={
x: 2,
y: 5,
result: 26
}
// 第二个方程
const b ={
x: 3,
y: 7,
result: 37
}
方程消元
2x + 5y = 26 ①
3x + 7y = 37 ②
① * 3 得到新的方程
6x + 15y = 78 ③
② * 2 得到新的方程
6x + 14y = 74 ④
③ - ④ 得
1y = 4 ⑤
⑤ 除以系数得到 y值
y = 4 / 1 = 4
对应的代码
function compute(a, b) {
// a * b.x
let ax = {
x: a.x * b.x,
y: a.y * b.x,
result: a.result * b.x
}
// b * a.x
let bx = {
x: b.x * a.x,
y: b.y * a.x,
result: b.result * a.x
}
// 相减,消元
let sub1 = {
x: 0,
y: a.y * b.x - b.y * a.x,
result: a.result * b.x - b.result * a.x
}
// 除法,得到y的值
let y = sub1.result / 1.0 / sub1.y;
console.log("y = ", y);
}
将一个已知数代入方程,求得另一个未知数
2x + 5 * 4 = 26 ①
x = (26 - 5* 4)/2
对应的代码
// 代入得到x的值
let x = (a.result - a.y * y) / 1.0 / a.x;
console.log("x = ", x);
至此,整个解方程的过程就结束了。
完整的代码如下
main();
function main(){
// 第一个方程
const a ={
x: 2,
y: 5,
result: 26
}
// 第二个方程
const b ={
x: 3,
y: 7,
result: 37
}
// 计算两个方程组
const result = compute(a, b);
}
function compute(a, b) {
// a * b.x
let ax = {
x: a.x * b.x,
y: a.y * b.x,
result: a.result * b.x
}
// b * a.x
let bx = {
x: b.x * a.x,
y: b.y * a.x,
result: b.result * a.x
}
// 相减,消元
let sub1 = {
x: 0,
y: a.y * b.x - b.y * a.x,
result: a.result * b.x - b.result * a.x
}
// 除法,得到y的值
let y = sub1.result / 1.0 / sub1.y;
// console.log("y = ", y);
// 代入得到x的值
let x = (a.result - a.y * y) / 1.0 / a.x;
// console.log("x = ", x);
// 打印最终结果
console.log("x = ", x, ",y = ", y);
}