剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了筑基初期的修炼,
这次要修炼的目标是[二元一次方程组]。
如果拿出三个半径不同的球面来看,会是这样的情况:
现在假设我们处于蓝色球面的最右端的一个点,[r2, 0, 0]。
看看[人叫板老师]怎么解的吧。
接着[人叫板老师]提出了三元一次方程组。
三元一次方程组是不可以简单的画线来求交点的,因为小伟尝试失败了:
[机器小伟]在[工程师阿伟]的陪同下进入了筑基初期的修炼,
这次要修炼的目标是[二元一次方程组]。
正剧开始:
星历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>
即使能求得交点,也很难看出具体的坐标值。毕竟是三个平面相交的交点。
所以还是老老实实地直接求解吧:
本节到此结束,欲知后事如何,请看下回分解。