[从头学数学] 第122节 二元一次方程组

剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了筑基初期的修炼,
这次要修炼的目标是[二元一次方程组]。

正剧开始:

星历2016年03月06日 10:21:24, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[二元一次方程组]。




正当小伟要进入修炼之中时,[工程师阿伟]的脑海中不知怎么地响起了《摘下满天星》的旋律,总是挥之不去,阿伟掐指一算,知道还是

应该先解决掉一个长期以来的观星疑惑,才能心无旁鹜地陪小伟修炼。


是什么疑惑呢?

先来看下这张图:


这其实是一个球面上的一些点,其实它们很有规律。


这里的每一个点是这样绘制的:

<span style="font-size:18px;">//绘制球体
this.sphere = function(pos/*[x, y, z]*/, r, style) {
	plot.save();
	
	var p = [].concat(pos);
	if (p.length == 2) {
		plot.translate(p[0], -p[1]);
	}
	else if (p.length == 3) {
		var p1 = shape.point3D(p[0], p[1], p[2]);
		plot.translate(p1[0], -p1[1]);
	}
	var r0 = 0.1*r;
	
	var grd = plot.createRadialGradient(0, 0, r, 0.3*r, -0.3*r, r0);  
    grd.addColorStop(0, style);  
    grd.addColorStop(1, 'white');  
      
    plot.setFillStyle(grd);  
      
    shape.fillCircle(0, 0, r); 
	plot.restore();

}</span>

如果拿出三个半径不同的球面来看,会是这样的情况:

当然,这是从上帝视角来看的,完全是一种旁观的情况。


<span style="font-size:18px;">function myDraw() {   
      
    var config = new PlotConfiguration();      
    config.init();      
    config.setPreference();  		
    
	var r = 10;

	config.setSector(1,1,1,1);  
	config.graphPaper2D(0, 0, r);
	config.axis3D(0, 0, 0, 180);  

	
	var r1 = 80, r2 = 120, r3 = 160;
	var x, y, z, angle1, angle2;
	var pArray1 = [];
	var pArray2 = [];
	var pArray3 = [];
	
	for (var thita = 0; thita < 360; thita+=30) {
		for (var rho = 0; rho < 360; rho +=30) {
			angle1 = thita*Math.PI/180;
			angle2 = rho*Math.PI/180;
			x = r1*Math.cos(angle1)*Math.cos(angle2);
			y = r1*Math.sin(angle1);
			z = r1*Math.cos(angle1)*Math.sin(angle2);
			pArray1.push([x,y,z]);
		}
	}
	
	shape.xyzSort(pArray1);
	var len = pArray1.length;
	
	for (var i = 0; i < len; i++) {
		shape.sphere(pArray1[i], r/2, 'red');
	}
		
		
		
	for (var thita = 0; thita < 360; thita+=30) {
		for (var rho = 0; rho < 360; rho +=30) {
			angle1 = thita*Math.PI/180;
			angle2 = rho*Math.PI/180;
			x = r2*Math.cos(angle1)*Math.cos(angle2);
			y = r2*Math.sin(angle1);
			z = r2*Math.cos(angle1)*Math.sin(angle2);
			pArray2.push([x,y,z]);
		}
	}
	
	shape.xyzSort(pArray2);
	len = pArray2.length;
	
	for (var i = 0; i < len; i++) {
		shape.sphere(pArray2[i], r/2, 'blue');
	}
	
	
	for (var thita = 0; thita < 360; thita+=30) {
		for (var rho = 0; rho < 360; rho +=30) {
			angle1 = thita*Math.PI/180;
			angle2 = rho*Math.PI/180;
			x = r3*Math.cos(angle1)*Math.cos(angle2);
			y = r3*Math.sin(angle1);
			z = r3*Math.cos(angle1)*Math.sin(angle2);
			pArray3.push([x,y,z]);
		}
	}
	
	shape.xyzSort(pArray3);
	len = pArray3.length;
	
	for (var i = 0; i < len; i++) {
		shape.sphere(pArray3[i], r/2, 'green');
	}
}</span>

现在假设我们处于蓝色球面的最右端的一个点,[r2, 0, 0]。

如果以这个点为中心,上帝视角就变成了:


可以看到,几乎绝大部分的其它单位都跑到左边去了。


<span style="font-size:18px;">function myDraw() {   
      
    var config = new PlotConfiguration();      
    config.init();      
    config.setPreference();  		
    
	var r = 10;

	config.setSector(1,1,1,1);  
	config.graphPaper2D(0, 0, r);
	config.axis3D(0, 0, 0, 180);  

	
	var r1 = 80, r2 = 120, r3 = 160;
	var x, y, z, angle1, angle2;
	var pArray1 = [];
	var pArray2 = [];
	var pArray3 = [];
	
	//现在假设我们处于r2半径带上的某个位置[r2, 0, 0]
	//观看到的是什么样的情况?
	for (var thita = 0; thita < 360; thita+=30) {
		for (var rho = 0; rho < 360; rho +=30) {
			angle1 = thita*Math.PI/180;
			angle2 = rho*Math.PI/180;
			x = r1*Math.cos(angle1)*Math.cos(angle2);
			y = r1*Math.sin(angle1);
			z = r1*Math.cos(angle1)*Math.sin(angle2);
			pArray1.push([x,y,z]);
		}
	}
	
	var len = pArray1.length;
	//目标点是我们的位置
	var objectPos = [r2, 0, 0];
	//源点是其它物体的位置,它们会产生变化
	var sourcePos = [];
	
	for (var i = 0; i < len; i++) {
		sourcePos = pArray1.shift();
		pArray1.push([sourcePos[0]-objectPos[0], 
					  sourcePos[1]-objectPos[1], 
					  sourcePos[2]-objectPos[2]]);
	}
	
	shape.xyzSort(pArray1);
	
	
	for (var i = 0; i < len; i++) {
		shape.sphere(pArray1[i], r/2, 'red');
	}
		
		
	
	for (var thita = 0; thita < 360; thita+=30) {
		for (var rho = 0; rho < 360; rho +=30) {
			angle1 = thita*Math.PI/180;
			angle2 = rho*Math.PI/180;
			x = r2*Math.cos(angle1)*Math.cos(angle2);
			y = r2*Math.sin(angle1);
			z = r2*Math.cos(angle1)*Math.sin(angle2);
			pArray2.push([x,y,z]);
		}
	}
	
	len = pArray2.length;
	
	for (var i = 0; i < len; i++) {
		sourcePos = pArray2.shift();
		pArray2.push([sourcePos[0]-objectPos[0], 
					  sourcePos[1]-objectPos[1], 
					  sourcePos[2]-objectPos[2]]);
	}
	
	
	shape.xyzSort(pArray2);
	
	
	for (var i = 0; i < len; i++) {
		shape.sphere(pArray2[i], r/2, 'blue');
	}
	
	
	for (var thita = 0; thita < 360; thita+=30) {
		for (var rho = 0; rho < 360; rho +=30) {
			angle1 = thita*Math.PI/180;
			angle2 = rho*Math.PI/180;
			x = r3*Math.cos(angle1)*Math.cos(angle2);
			y = r3*Math.sin(angle1);
			z = r3*Math.cos(angle1)*Math.sin(angle2);
			pArray3.push([x,y,z]);
		}
	}
	len = pArray3.length;
	
	for (var i = 0; i < len; i++) {
		sourcePos = pArray3.shift();
		pArray3.push([sourcePos[0]-objectPos[0], 
					  sourcePos[1]-objectPos[1], 
					  sourcePos[2]-objectPos[2]]);
	}
	
	shape.xyzSort(pArray3);
	
	
	for (var i = 0; i < len; i++) {
		shape.sphere(pArray3[i], r/2, 'green');
	}
	
	shape.sphere([0, 0, 0], r, 'purple');
}
</span>


但是我们不是上帝,我们正在这个紫色的单元上,假如我们向左看,会是什么样的景象呢?


这样我们可以认为,越是平行于我们的视线,一般来说离我们越近的可能性越大。但是,你是不可能确定的。

<span style="font-size:18px;">function myDraw() {   
      
    var config = new PlotConfiguration();      
    config.init();      
    config.setPreference();  		
    
	var r = 10;

	config.setSector(1,1,1,1);  
	config.graphPaper2D(0, 0, r);
	config.axis3D(0, 0, 0, 180);  

	
	var r1 = 80, r2 = 120, r3 = 160;
	var x, y, z, angle1, angle2;
	var pArray1 = [];
	var pArray2 = [];
	var pArray3 = [];
	
	//现在假设我们处于r2半径带上的某个位置[r2, 0, 0]
	//观看到的是什么样的情况?
	for (var thita = 0; thita < 360; thita+=30) {
		for (var rho = 0; rho < 360; rho +=30) {
			angle1 = thita*Math.PI/180;
			angle2 = rho*Math.PI/180;
			x = r1*Math.cos(angle1)*Math.cos(angle2);
			y = r1*Math.sin(angle1);
			z = r1*Math.cos(angle1)*Math.sin(angle2);
			pArray1.push([x,y,z]);
		}
	}
	
	var len = pArray1.length;
	//目标点是我们的位置
	var objectPos = [r2, 0, 0];
	//源点是其它物体的位置,它们会产生变化
	var sourcePos = [];
	
	for (var i = 0; i < len; i++) {
		sourcePos = pArray1.shift();
		pArray1.push([sourcePos[0]-objectPos[0], 
					  sourcePos[1]-objectPos[1], 
					  sourcePos[2]-objectPos[2]]);
	}
	
	var tmp = [];
	for (var i = 0; i < len; i++) {
		tmp = pArray1.shift();
		if (tmp[0]<0) {
			//从右边往左边看到的点阵列中的投影
			pArray1.push(pointRight(tmp[0], tmp[1], tmp[2]));
		}
	}
	
	//如果点位于目标右侧,就会看不到,因为现在是向左边看
	len = pArray1.length;
	
	for (var i = 0; i < len; i++) {
		shape.sphere(pArray1[i], r/2, 'red');
	}
		
		
	
	for (var thita = 0; thita < 360; thita+=30) {
		for (var rho = 0; rho < 360; rho +=30) {
			angle1 = thita*Math.PI/180;
			angle2 = rho*Math.PI/180;
			x = r2*Math.cos(angle1)*Math.cos(angle2);
			y = r2*Math.sin(angle1);
			z = r2*Math.cos(angle1)*Math.sin(angle2);
			pArray2.push([x,y,z]);
		}
	}
	
	len = pArray2.length;
	
	for (var i = 0; i < len; i++) {
		sourcePos = pArray2.shift();
		pArray2.push([sourcePos[0]-objectPos[0], 
					  sourcePos[1]-objectPos[1], 
					  sourcePos[2]-objectPos[2]]);
	}
	
	for (var i = 0; i < len; i++) {
		tmp = pArray2.shift();
		if (tmp[0]<0) {
			//从右边往左边看到的点阵列中的投影
			pArray2.push(pointRight(tmp[0], tmp[1], tmp[2]));
		}
	}
	
	//如果点位于目标右侧,就会看不到,因为现在是向左边看
	len = pArray2.length;
	
	
	
	for (var i = 0; i < len; i++) {
		shape.sphere(pArray2[i], r/2, 'blue');
	}
	
	
	for (var thita = 0; thita < 360; thita+=30) {
		for (var rho = 0; rho < 360; rho +=30) {
			angle1 = thita*Math.PI/180;
			angle2 = rho*Math.PI/180;
			x = r3*Math.cos(angle1)*Math.cos(angle2);
			y = r3*Math.sin(angle1);
			z = r3*Math.cos(angle1)*Math.sin(angle2);
			pArray3.push([x,y,z]);
		}
	}
	len = pArray3.length;
	
	for (var i = 0; i < len; i++) {
		sourcePos = pArray3.shift();
		pArray3.push([sourcePos[0]-objectPos[0], 
					  sourcePos[1]-objectPos[1], 
					  sourcePos[2]-objectPos[2]]);
	}
	
	for (var i = 0; i < len; i++) {
		tmp = pArray3.shift();
		if (tmp[0]<0) {
			//从右边往左边看到的点阵列中的投影
			pArray3.push(pointRight(tmp[0], tmp[1], tmp[2]));
		}
	}
	
	//如果点位于目标右侧,就会看不到,因为现在是向左边看
	len = pArray3.length;
	
	
	for (var i = 0; i < len; i++) {
		shape.sphere(pArray3[i], r/2, 'green');
	}
	
	shape.sphere([0, 0, 0], r, 'purple');
}</span>

<span style="font-size:18px;">this.point3D = function(x0, y0, z0) {
	//canvas中y轴坐标向下为正,与笛卡尔坐标系相反
	//所以此处先取反
	//
	z0 = z0 /2;
	x0 = x0 - z0*0.707;
	y0 = y0 + z0*0.707;
	
	
	return [x0, y0];	
}

//左视投影,此时x坐标是无所谓的
this.pointLeft = function(x0, y0, z0) {
	return [z0, y0];
}
//右视投影
this.pointRight = function(x0, y0, z0) {
	return [-z0, y0];
}
//俯视投影
this.pointTop = function(x0, y0, z0) {
	return [x0, -z0];
}
//仰视投影
this.pointBottom = function(x0, y0, z0) {
	return [x0, z0];
}
//主视投影
this.pointFront = function(x0, y0, z0) {
	return [x0, y0];
}
//后视投影
this.pointBack = function(x0, y0, z0) {
	return [-x0, y0];
}</span>


疑惑解除了,现在可以进入正式的修炼了。



对于简单的二元一次方程组,当然可以用两条直线的交点来表示它的解。


<span style="font-size:18px;">function myDraw() {   
      
    var config = new PlotConfiguration();      
    config.init();      
    config.setPreference();  		
    
	var r = 20;

	config.setSector(1,1,1,1);  
	config.graphPaper2D(0, 0, r);
	config.axis2D(0, 0, 180);  

	
	var xArray = [-300/r, 300/r];
	var yArray = [-150/r, 150/r];
	
	var array = [];
	var array2 = [];
	//x+y=10 ==> y = 10-x
	for (var i = 0; i < xArray.length; i++) {
		array.push(xArray[i], 10-xArray[i]);
	}

	//2*x+y=16 ==> y = 16-2*x
	for (var i = 0; i < xArray.length; i++) {
		array2.push(xArray[i], 16-2*xArray[i]);
	}
	
	shape.multiLineDraw(array, 'red', r);
	shape.multiLineDraw(array2, 'blue', r);
	
	shape.sphere([6*r,4*r], r/2, 'purple');
}</span>

<span style="font-size:18px;">//例1
function myDraw() {   
      
    var config = new PlotConfiguration();      
    config.init();      
    config.setPreference();  		
    
	var r = 20;

	config.setSector(1,1,1,1);  
	config.graphPaper2D(0, 0, r);
	config.axis2D(0, 0, 180);  

	
	var xArray = [-300/r, 300/r];
	var yArray = [-150/r, 150/r];
	
	var array = [];
	var array2 = [];
	//
	for (var i = 0; i < xArray.length; i++) {
		array.push(xArray[i], xArray[i]-3);
	}

	//
	for (var i = 0; i < xArray.length; i++) {
		array2.push(xArray[i], (3*xArray[i]-14)/8);
	}
	
	shape.multiLineDraw(array, 'red', r);
	shape.multiLineDraw(array2, 'blue', r);
	
	shape.sphere([2*r,-1*r], r/2, 'purple');
}</span>


当然,一般还是直接解答。

<span style="font-size:18px;">def tmp():  
    #未知数系数  
    a = np.matrix([[1, -1], [3, -8]]);  
    #值  
    b = np.array([3, 14]);  
    #方程的解  
    c = np.linalg.solve(a, b);  
    print(c);
	
>>> 
[ 2. -1.]</span>

看看[人叫板老师]怎么解的吧。

<span style="font-size:18px;">#例3
>>> 
[ 6.  -0.5]

def tmp():  
    #未知数系数  
    a = np.matrix([[3, 4], [5, -6]]);  
    #值  
    b = np.array([16, 33]);  
    #方程的解  
    c = np.linalg.solve(a, b);  
    print(c);</span>

<span style="font-size:18px;">#探究3
120*1.2*x+110*1.2*y=97200
10*1.5*x+20*1.5*y=15000
=>x=   y=

>>> 
[ 400.  300.]
>>> 300*8000-400*1000-97200-15000
1887800</span>

<span style="font-size:18px;">def tmp():  
    #未知数系数  
    a = np.matrix([[120, 110], [10, 20]]);  
    #值  
    b = np.array([97200/1.2, 15000/1.5]);  
    #方程的解  
    c = np.linalg.solve(a, b);  
    print(c);</span>



接着[人叫板老师]提出了三元一次方程组。


<span style="font-size:18px;">def tmp():  
    #未知数系数  
    a = np.matrix([[1,1,1], [1,2,5], [1, -4, 0]]);  
    #值  
    b = np.array([12, 22, 0]);  
    #方程的解  
    c = np.linalg.solve(a, b);  
    print(c);</span>

<span style="font-size:18px;">def tmp():
    import numpy as np;
    #未知数系数  
    a = np.matrix([[3,0,4], [2,3,1], [5,-9,7]]);  
    #值  
    b = np.array([7,9,8]);  
    #方程的解  
    c = np.linalg.solve(a, b);  
    print(c);</span>

三元一次方程组是不可以简单的画线来求交点的,因为小伟尝试失败了:

<span style="font-size:18px;">function myDraw() {   
      
    var config = new PlotConfiguration();      
    config.init();      
    config.setPreference();  		
    
	var r = 30;

	config.setSector(1,1,1,1);  
	config.graphPaper2D(0, 0, r);
	config.axis3D(0, 0, 0, 180);  

	
	var xArray = [-300/r, 300/r];
	var yArray = [-150/r, 150/r];
	
	var array = [];
	var array2 = [];
	var array3 = [];
	
	//
	for (var i = 0; i < xArray.length; i++) {
		array.push(shape.point3D(xArray[i], 0, (7-3*xArray[i])/4));
	}

	//
	for (var i = 0; i < xArray.length; i++) {
		array2.push(shape.point3D(xArray[i], yArray[i], 9-2*xArray[i]-3*yArray[i]));
	}
	//
	for (var i = 0; i < xArray.length; i++) {
		array3.push(shape.point3D(xArray[i], yArray[i], (8-5*xArray[i]+9*yArray[i])/7));
	}
	shape.multiLineDraw(array, 'red', r);
	shape.multiLineDraw(array2, 'blue', r);
	shape.multiLineDraw(array3, 'green', r);
	
	//shape.sphere([2*r,-1*r], r/2, 'purple');
}</span>

即使能求得交点,也很难看出具体的坐标值。毕竟是三个平面相交的交点。


所以还是老老实实地直接求解吧:


本节到此结束,欲知后事如何,请看下回分解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值