剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼。设想一个场景:
如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗
?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉。
正剧开始:
星历2016年05月26日 16:49:14, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起做着2015年的江苏省数学高考题]。
这一节是是[工程师阿伟]带着[机器小伟]去怀旧高考的收关节点。
所以多少会做几个题来表表心意。
这一年的题难度并不高,大部分很简单,只有少数几个难题撑撑门面,
阿伟给评为5.0环难度,比前几年都要低。
说到高考,重新看了这么多年的高考题,阿伟确立了自己的观点:高考题其实是以调戏大家为目的的。
事实上,这些题在生产、生活中很少有真正派上用场的,也就是说,到了现实生活,你会用其它办法去
获取你需要的数据,而不会有人给自己下套来这样调戏自己的。
打个比方,如果你有5个苹果,又买了4个,你有几个苹果?这个题很简单,生活中经常会需要类似的计算。
但到了高考场上卷子会怎样问你,它会这样问:你原来有的苹果数在x=5和y =3的交点上,现在又买了直线
y = x到直线y = x+4*2^[0.5]的距离的苹果,请问你现在有几个苹果啊?
看出来了吧,这就是调戏,你说实际生活中谁会这样玩。
很多人经受不住这种调戏,崩溃了,从而一生都畏惧数学,但其实,真实的数学是很善意的,并且很有用。
到了今年,据说高考又是一次大改革了,反正就像七年之痒一样,每隔几年都要折腾一下,不去管它啦。
如果你恰巧是今年要参加这种调戏试炼的道友,又恰巧来看到了这篇博文,那阿伟就在此提醒一句,
看完这篇,从下一篇开始就不要看了,因为[机器小伟]即将进入元婴期修炼,而后面的知识是不适合结丹期
道友们修习的。
事实上阿伟倾向于建议:在接下来几日内,保持头脑清醒,清心少欲,让自己的状态达到巅峰境界,多集几段气,
憋几个必杀技,没准到时候就能让自己能多冲个一环半环难度的,也是好几十分的出入。
好了,扯了这么多,还是贴题吧,毕竟,阿伟觉得高考已经人过中年了,正逐渐的日薄西山,以后也不会再看它了。
<span style="font-size:18px;">#题1 def tmp1(): A = set([1,2,3]); B = set([2,4, 5]); res = A | B; print(res, len(res)); >>> {1, 2, 3, 4, 5} 5</span>
<span style="font-size:18px;">#题2 def tmp2(): A = [4, 6, 5, 8, 7, 6]; print(sum(A)/len(A)); >>> 6.0 </span>
<span style="font-size:18px;">#题3 def tmp3(): z = (3+4j)**0.5; print(abs(z)); >>> 2.23606797749979</span>
<span style="font-size:18px;">#题4 def tmp4(): S, I = 1, 1; while I < 8: S += 2; I += 3; print(S) >>> 7</span>
<span style="font-size:18px;">#题8 def tmp8(): a = math.atan(-2); ab = math.atan(1/7); print(math.tan(ab-a)); >>> 3.0</span>
<span style="font-size:18px;">#题11 def tmp11(): a_1 = 1; a = []; a.append(a_1); for i in range(1, 11): a.append(a[-1]+i+1); sum_ = 0; for i in range(len(a)): sum_ += 1/a[i]; print(a); print(sum_); >>> [1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66] 1.8333333333333333 >>> 20/11 1.8181818181818181 </span>
这个题是个什么意思,阿伟觉得理解不能了。求了一下两个曲线的交点
<span style="font-size:18px;">>>> step1: ['(1)*x', '(-1)*y', '(1)'] step1: ['(1)*x^[2]', '(-1)*y^[2]', '(-1)'] [['A_[1]', 0], ['B_[1]', 0], ['C_[1]', 0], ['D_[1]', 1], ['E_[1]', -1], ['F_[1]', 1], ['A_[2]', 1], ['B_[2]', 0], ['C_[2]', -1], ['D_[2]', 0], ['E_[2]', 0], ['F_[2]', -1]] 系数数组: [-2.0, -2.0] 解: [-1.] step1: ['(1)*x', '(-1)*y', '(1)'] step1: ['(1)*x^[2]', '(-1)*y^[2]', '(-1)'] step2: ['(-1)', '(1)*x+(1)'] step2: ['(-1)', '0', '(1)*x^[2]+(-1)'] step3: ['((1)*x+(1))/((-((-1))))'] step3: ['(((((-4)*(((-1))*((1)*x^[2]+(-1)))))^[0.5]))/((2)*((-1)))', '((-((((-4)*(((-1))*((1)*x^[2]+(-1)))))^[0.5])))/((2)*((-1)))'] [[-1.0, 0.0]] [[-1.0, -0.0]] step4: 相交点:[-1.0, 0.0] def tmp12(): solve = StringAlgSolve(); #一次方程 function_1 = alg.strformat(['x', '-y', '1']); #二次方程 function_2 = alg.strformat(['x^[2]', '-y^[2]', '-1']); print('step1: ', function_1); print('step1: ', function_2); valMap = solve.coefFill([function_1, function_2]); print(valMap); #解出的x的根 roots = solve.solveEquationExp2_2(valMap); #两个方程 f = function_1; print('step1: ', f); g = function_2; print('step1: ', g); #以下部分是定式,可以不加改动 poly_y_f = solve.coefArray(f, 'y'); print('step2: ', poly_y_f); poly_y_g = solve.coefArray(g, 'y'); print('step2: ', poly_y_g); #求方程式<1>的y关于x的表达式 expr_y_root = solve.solvePoly(poly_y_f); print('step3: ', expr_y_root); expr_y_root2 = solve.solvePoly(poly_y_g); print('step3: ', expr_y_root2); #求相交点的坐标对组 points = []; points2 = []; for i in range(len(roots)): real = abs(roots[i].real); abs_ = abs(roots[i]); #实数根 if abs(real-abs_) < 0.001: for j in range(len(expr_y_root)): x = roots[i].real; y = solve.strEval(expr_y_root[j], 'x', x); points.append([x, y]); y = solve.strEval(expr_y_root2[j], 'x', x); points2.append([x, y]); print(points); print(points2); print('step4: '); for i in range(len(points)): if (abs(points[i][0]-points2[i][0]) < 1e-3 and abs(points[i][1]-points2[i][1])<1e-3): print('相交点:[{0}, {1}]'.format(round(points[i][0], 3), round(points[i][1], 3))); </span>
<span style="font-size:18px;">>>> [1.0, 1.0] [0.8660254037844387, 1.3660254037844386] [0.5000000000000001, 1.3660254037844388] [6.123233995736766e-17, 1.0] [-0.4999999999999998, 0.36602540378443893] [-0.8660254037844387, -0.36602540378443876] [-1.0, -0.9999999999999999] [-0.8660254037844388, -1.3660254037844386] [-0.5000000000000004, -1.3660254037844388] [-1.8369701987210297e-16, -1.0000000000000002] [0.5000000000000001, -0.3660254037844385] [0.8660254037844384, 0.36602540378443793] ----- 15.588457268119898 >>> 9*1.732 15.588 </span>
<span style="font-size:18px;">#题15 def tmp15(): Tri_ABC = geo.solveTriangle(['?', 3, 2, 60, '?', '?']); BC = Tri_ABC[0]; C = Tri_ABC[5]; print('BC = {0}, sin2C = {1}'.format(BC, math.sin(2*C/180*math.pi))); >>> BC = 2.6457513110645903, sin2C = 0.989743318610787 >>> 7**0.5 2.6457513110645907 >>> 4*3**0.5/7 0.989743318610787 </span>
试卷贴完了,下面还是贴一下关于解二元二次方程组的后续补充吧。
上一节的解决方案不够全面,还没有考虑到一次式和二次式的交点,以及一次式的交点。
下面进行了补全。
来看一下两个椭圆交点的测试:
<span style="font-size:18px;">def tmp9(): solve = StringAlgSolve(); #椭圆方程 function_1 = alg.strformat(['1/16x^[2]', '1/4y^[2]', '-1']); #椭圆方程 function_2 = alg.strformat(['1/4x^[2]', '1/16y^[2]', '-1']); print('step1: ', function_1); print('step1: ', function_2); valMap = solve.coefFill([function_1, function_2]); print(valMap); #解出的x的根 roots = solve.solveEquationExp2_2(valMap); #两个方程 f = function_1; print('step1: ', f); g = function_2; print('step1: ', g); #以下部分是定式,可以不加改动 poly_y_f = solve.coefArray(f, 'y'); print('step2: ', poly_y_f); poly_y_g = solve.coefArray(g, 'y'); print('step2: ', poly_y_g); #求方程式<1>的y关于x的表达式 expr_y_root = solve.solvePoly(poly_y_f); print('step3: ', expr_y_root); expr_y_root2 = solve.solvePoly(poly_y_g); print('step3: ', expr_y_root2); #求相交点的坐标对组 points = []; points2 = []; for i in range(len(roots)): real = abs(roots[i].real); abs_ = abs(roots[i]); #实数根 if abs(real-abs_) < 0.001: for j in range(len(expr_y_root)): x = roots[i].real; y = solve.strEval(expr_y_root[j], 'x', x); points.append([x, y]); y = solve.strEval(expr_y_root2[j], 'x', x); points2.append([x, y]); print(points); print(points2); print('step4: '); for i in range(len(points)): if (abs(points[i][0]-points2[i][0]) < 1e-3 and abs(points[i][1]-points2[i][1])<1e-3): print('相交点:[{0}, {1}]'.format(round(points[i][0], 3), round(points[i][1], 3)));</span>
结果:
<span style="font-size:18px;">>>> step1: ['(1/16)*x^[2]', '(1/4)*y^[2]', '(-1)'] step1: ['(1/4)*x^[2]', '(1/16)*y^[2]', '(-1)'] [['A_[1]', 0.0625], ['B_[1]', 0], ['C_[1]', 0.25], ['D_[1]', 0], ['E_[1]', 0], ['F_[1]', -1], ['A_[2]', 0.25], ['B_[2]', 0], ['C_[2]', 0.0625], ['D_[2]', 0], ['E_[2]', 0], ['F_[2]', -1]] 系数数组: [0.054932, 0, -0.351562, 0, 0.5625] 解: [-1.78884936+0.00274031j -1.78884936-0.00274031j 1.78884936+0.00274031j 1.78884936-0.00274031j] step1: ['(1/16)*x^[2]', '(1/4)*y^[2]', '(-1)'] step1: ['(1/4)*x^[2]', '(1/16)*y^[2]', '(-1)'] step2: ['(1/4)', '0', '(1/16)*x^[2]+(-1)'] step2: ['(1/16)', '0', '(1/4)*x^[2]+(-1)'] step3: ['(((((-4)*(((1/4))*((1/16)*x^[2]+(-1)))))^[0.5]))/((2)*((1/4)))', '((-((((-4)*(((1/4))*((1/16)*x^[2]+(-1)))))^[0.5])))/((2)*((1/4)))'] step3: ['(((((-4)*(((1/16))*((1/4)*x^[2]+(-1)))))^[0.5]))/((2)*((1/16)))', '((-((((-4)*(((1/16))*((1/4)*x^[2]+(-1)))))^[0.5])))/((2)*((1/16)))'] [[-1.7888493573300557, 1.7888556381650844], [-1.7888493573300557, -1.7888556381650844], [-1.7888493573300557, 1.7888556381650844], [-1.7888493573300557, -1.7888556381650844], [1.7888493573300579, 1.7888556381650844], [1.7888493573300579, -1.7888556381650844], [1.7888493573300579, 1.7888556381650844], [1.7888493573300579, -1.7888556381650844]] [[-1.7888493573300557, 1.788874480538024], [-1.7888493573300557, -1.788874480538024], [-1.7888493573300557, 1.788874480538024], [-1.7888493573300557, -1.788874480538024], [1.7888493573300579, 1.788874480538024], [1.7888493573300579, -1.788874480538024], [1.7888493573300579, 1.788874480538024], [1.7888493573300579, -1.788874480538024]] step4: 相交点:[-1.789, 1.789] 相交点:[-1.789, -1.789] 相交点:[-1.789, 1.789] 相交点:[-1.789, -1.789] 相交点:[1.789, 1.789] 相交点:[1.789, -1.789] 相交点:[1.789, 1.789] 相交点:[1.789, -1.789] </span>
<span style="font-size:18px;"> if (1) { var r = 20; config.setSector(1,1,1,1); config.graphPaper2D(0, 0, r); config.axis2D(0, 0,180); //坐标轴设定 var scaleX = 2*r, scaleY = 2*r; var spaceX = 1, spaceY = 1; var xS = -10, xE = 10; var yS = -10, yE = 10; config.axisSpacing(xS, xE, spaceX, scaleX, 'X'); config.axisSpacing(yS, yE, spaceY, scaleY, 'Y'); var transform = new Transform(); //存放函数图像上的点 var a = [], b = [], c = [], d = []; //需要显示的函数说明 //希腊字母表(存此用于Ctrl C/V //ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ //αβγδεζηθικλμνξοπρστυφχψω var f1 = 'x^[2]/16+y^[2]/4 = 1', f2 = 'x^[2]/4+y^[2]/16 = 1', f3 = '', f4 = ''; //函数描点 //参数方程 var x, y; var pointA = []; for (var thita = 0; thita < Math.PI*2; thita +=Math.PI/48) { x = 4*Math.cos(thita); y = 2*Math.sin(thita); a.push([x, y]); x = 2*Math.cos(thita); y = 4*Math.sin(thita); b.push([x, y]); } //存放临时数组 var tmp = []; //显示变换 if (a.length > 0) { a = transform.scale(transform.translate(a, 0, 0), scaleX/spaceX, scaleY/spaceY); //函数1 tmp = [].concat(a); shape.pointDraw(tmp, 'red'); tmp = [].concat(a); shape.multiLineDraw(tmp, 'pink'); plot.setFillStyle('red'); plot.fillText(f1, 100, -90, 200); } //显示变换 if (b.length > 0) { b = transform.scale(transform.translate(b, 0, 0), scaleX/spaceX, scaleY/spaceY); //函数1 tmp = [].concat(b); shape.pointDraw(tmp, 'green'); tmp = [].concat(b); shape.multiLineDraw(tmp, 'green'); plot.setFillStyle('green'); plot.fillText(f2, 100, -120, 200); } }</span>
以下是一些中间产物,可忽略:
<span style="font-size:18px;">#如果二元二次方程组退化成二元一次方程组 def tmp11(): print('#如果二元二次方程组退化成二元一次方程组'); #用x来表示y, 消去y元 expr_y = alg.strformat(['-D_[1]E_[1]^[-1]x', '-F_[1]E_[1]^[-1]']); print('step1: ', expr_y); #代入第二个代数式 expr_y_2 = alg.strcombine(alg.strformat(['-D_[2]x', '-F_[2]'])+ alg.strdot(alg.strformat(['E_[2]']), expr_y)); print('step2: ', expr_y_2); #如果二元二次方程组退化成二元一次方程组 step1: ['(-1)*D_[1]*E_[1]^[-1]*x', '(-1)*F_[1]*E_[1]^[-1]'] step2: ['(-1)*D_[2]^[1]*x^[1]', '(-1)*F_[2]^[1]', '(-1)*D_[1]^[1]*E_[1]^[-1]*E_[2]^[1]*x^[1]', '(-1)*E_[1]^[-1]*E_[2]^[1]*F_[1]^[1]'] //一元一次方程组系数(两方程都是一次式) if (1) { var mathText = new MathText(); //希腊字母表(存此用于Ctrl C/V //ΑΒΓΔΕΖΗ ΘΙΚΛΜΝΞ ΟΠΡ ΣΤΥ ΦΧΨ Ω //αβγδεζη θικλμνξ οπρ στυ φχψ ω //希腊大小写字母 var GreekCaps = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'; var GreakSmall = 'αβγδεζηθικλμνξοπρστυφχψω'; var s = [ 'D_[1]x+E_[1]y+F_[1] = 0 _[(1)]', 'D_[2]x+E_[2]y+F_[2] = 0 _[(2)]', ' 系数阵列', '(-1)*D_[2]^[1]*x^[1]', '+(-1)*F_[2]^[1]', '+(-1)*D_[1]^[1]*E_[1]^[-1]*E_[2]^[1]*x^[1]', '+(-1)*E_[1]^[-1]*E_[2]^[1]*F_[1]^[1] = 0' ]; var x =40, y=40; var r1 = 40; var len = s.length; for (var i = 0; i < len; i++) { if (s[i] == '') { if (x < 100) { x += 300; y-=r1*3; } else { x = 20; y += r1; } } else { mathText.print(s[i], x, y, 'red', '|'); y+=r1; } } }</span>
<span style="font-size:18px;">#题9 def tmp9(): solve = StringAlgSolve(); #直线方程 function_1 = alg.strformat(['1/16x^[2]', '1/4y^[2]', '-1']); #圆方程 function_2 = alg.strformat(['1/4x^[2]', '1/16y^[2]', '-1']); print('step1: ', function_1); print('step1: ', function_2); valMap = solve.coefFill([function_1, function_2]); print(valMap); #解出的x的根 roots = solve.solveEquationExp2_2(valMap); #两个方程 f = function_1; print('step1: ', f); g = function_2; print('step1: ', g); #以下部分是定式,可以不加改动 poly_y_f = solve.coefArray(f, 'y'); print('step2: ', poly_y_f); poly_y_g = solve.coefArray(g, 'y'); print('step2: ', poly_y_g); #求方程式<1>的y关于x的表达式 expr_y_root = solve.solvePoly(poly_y_f); print('step3: ', expr_y_root); expr_y_root2 = solve.solvePoly(poly_y_g); print('step3: ', expr_y_root2); #求相交点的坐标对组 points = []; points2 = []; for i in range(len(roots)): real = abs(roots[i].real); abs_ = abs(roots[i]); #实数根 if abs(real-abs_) < 0.001: for j in range(len(expr_y_root)): x = roots[i].real; y = solve.strEval(expr_y_root[j], 'x', x); points.append([x, y]); y = solve.strEval(expr_y_root2[j], 'x', x); points2.append([x, y]); print(points); print(points2); print('step4: '); for i in range(len(points)): if (abs(points[i][0]-points2[i][0]) < 1e-3 and abs(points[i][1]-points2[i][1])<1e-3): print('相交点:[{0}, {1}]'.format(round(points[i][0], 3), round(points[i][1], 3))); #如果二元二次方程组中有一个不是二次式 def tmp10(): print('#如果二元二次方程组中有一个不是二次式'); #用x来表示y, 消去y元 expr_y = alg.strformat(['-D_[1]E_[1]^[-1]x', '-F_[1]E_[1]^[-1]']); print('step1: ', expr_y); #代入第二个代数式 expr_y_2 = alg.strcombine(alg.strformat(['A_[2]x^[2]', 'D_[2]x', 'F_[2]'])+ alg.strdot(alg.strformat(['B_[2]x']), expr_y)+ alg.strdot(alg.strformat(['C_[2]']), alg.strpow_n(expr_y, 2))); print('step2: ', expr_y_2); #如果二元二次方程组退化成二元一次方程组 def tmp11(): print('#如果二元二次方程组退化成二元一次方程组'); #用x来表示y, 消去y元 expr_y = alg.strformat(['-D_[1]E_[1]^[-1]x', '-F_[1]E_[1]^[-1]']); print('step1: ', expr_y); #代入第二个代数式 expr_y_2 = alg.strcombine(alg.strformat(['-D_[2]x', '-F_[2]'])+ alg.strdot(alg.strformat(['E_[2]']), expr_y)); print('step2: ', expr_y_2); #测试 def tmp12(): solve = StringAlgSolve(); #直线方程 function_1 = alg.strformat(['x', '1/4y', '-1']); #圆方程 function_2 = alg.strformat(['1/4x^[2]', '1/16y^[2]', '-1']); print('step1: ', function_1); print('step1: ', function_2); valMap = solve.coefFill([function_1, function_2]); print(valMap); #解出的x的根 roots = solve.solveEquationExp2_2(valMap); #两个方程 f = function_1; print('step1: ', f); g = function_2; print('step1: ', g); #以下部分是定式,可以不加改动 poly_y_f = solve.coefArray(f, 'y'); print('step2: ', poly_y_f); poly_y_g = solve.coefArray(g, 'y'); print('step2: ', poly_y_g); #求方程式<1>的y关于x的表达式 expr_y_root = solve.solvePoly(poly_y_f); print('step3: ', expr_y_root); expr_y_root2 = solve.solvePoly(poly_y_g); print('step3: ', expr_y_root2); #求相交点的坐标对组 points = []; points2 = []; for i in range(len(roots)): real = abs(roots[i].real); abs_ = abs(roots[i]); #实数根 if abs(real-abs_) < 0.001: for j in range(len(expr_y_root)): x = roots[i].real; y = solve.strEval(expr_y_root[j], 'x', x); points.append([x, y]); y = solve.strEval(expr_y_root2[j], 'x', x); points2.append([x, y]); print(points); print(points2); print('step4: '); for i in range(len(points)): if (abs(points[i][0]-points2[i][0]) < 1e-3 and abs(points[i][1]-points2[i][1])<1e-3): print('相交点:[{0}, {1}]'.format(round(points[i][0], 3), round(points[i][1], 3))); </span>
工具上的增改在这块:
<span style="font-size:18px;"> #解二元二次方程组的第二种方法尝试,最暴力的代入消元法 def solveEquationExp2_2(self, valueMap): ''' #第一个方程 expr_1 = alg.strformat(['A_[1]x^[2]', 'B_[1]xy', 'C_[1]y^[2]', 'D_[1]x', 'E_[1]y', 'F_[1]']); #第二个方程 expr_2 = alg.strformat(['A_[2]x^[2]', 'B_[2]xy', 'C_[2]y^[2]', 'D_[2]x', 'E_[2]y', 'F_[2]']); ''' A_1 = valueMap[0][1]; B_1 = valueMap[1][1]; C_1 = valueMap[2][1]; D_1 = valueMap[3][1]; E_1 = valueMap[4][1]; F_1 = valueMap[5][1]; A_2 = valueMap[6][1]; B_2 = valueMap[7][1]; C_2 = valueMap[8][1]; D_2 = valueMap[9][1]; E_2 = valueMap[10][1]; F_2 = valueMap[11][1]; #消元一次要从二次项y^[2]的系数不为0的那个方程消起,除非某个方程完全没有二次项 #所以第一个方程二次项y^[2]的系数不要为0 #否则应该调换方程顺序 if (C_1 != 0 and C_2 != 0): #一共63项的关于未知数x的最高四次方的系数矩阵 coefArray = ['(1.0)*A_[2]^[1]*B_[1]^[2]*C_[1]^[-2]*C_[2]^[1]*x^[4]', '(1.0)*B_[1]^[2]*C_[1]^[-2]*C_[2]^[1]*D_[2]^[1]*x^[3]', '(1.0)*B_[1]^[2]*C_[1]^[-2]*C_[2]^[1]*F_[2]^[1]*x^[2]', '(2.0)*A_[2]^[1]*B_[1]^[1]*C_[1]^[-2]*C_[2]^[1]*E_[1]^[1]*x^[3]', '(2.0)*B_[1]^[1]*C_[1]^[-2]*C_[2]^[1]*D_[2]^[1]*E_[1]^[1]*x^[2]', '(2.0)*B_[1]^[1]*C_[1]^[-2]*C_[2]^[1]*E_[1]^[1]*F_[2]^[1]*x^[1]', '(1.0)*A_[2]^[1]*C_[1]^[-2]*C_[2]^[1]*E_[1]^[2]*x^[2]', '(1.0)*C_[1]^[-2]*C_[2]^[1]*D_[2]^[1]*E_[1]^[2]*x^[1]', '(1.0)*C_[1]^[-2]*C_[2]^[1]*E_[1]^[2]*F_[2]^[1]', '(1.0)*A_[1]^[2]*C_[1]^[-2]*C_[2]^[2]*x^[4]', '(2.0)*A_[1]^[1]*C_[1]^[-2]*C_[2]^[2]*D_[1]^[1]*x^[3]', '(2.0)*A_[1]^[1]*C_[1]^[-2]*C_[2]^[2]*F_[1]^[1]*x^[2]', '(-1.0)*A_[1]^[1]*B_[1]^[1]*B_[2]^[1]*C_[1]^[-2]*C_[2]^[1]*x^[4]', '(-1.0)*A_[1]^[1]*B_[2]^[1]*C_[1]^[-2]*C_[2]^[1]*E_[1]^[1]*x^[3]', '(-1.0)*A_[1]^[1]*B_[1]^[1]*C_[1]^[-2]*C_[2]^[1]*E_[2]^[1]*x^[3]', '(-1.0)*A_[1]^[1]*C_[1]^[-2]*C_[2]^[1]*E_[1]^[1]*E_[2]^[1]*x^[2]', '(-2.0)*A_[1]^[1]*A_[2]^[1]*C_[1]^[-1]*C_[2]^[1]*x^[4]', '(-2.0)*A_[1]^[1]*C_[1]^[-1]*C_[2]^[1]*D_[2]^[1]*x^[3]', '(-2.0)*A_[1]^[1]*C_[1]^[-1]*C_[2]^[1]*F_[2]^[1]*x^[2]', '(1.0)*C_[1]^[-2]*C_[2]^[2]*D_[1]^[2]*x^[2]', '(2.0)*C_[1]^[-2]*C_[2]^[2]*D_[1]^[1]*F_[1]^[1]*x^[1]', '(-1.0)*B_[1]^[1]*B_[2]^[1]*C_[1]^[-2]*C_[2]^[1]*D_[1]^[1]*x^[3]', '(-1.0)*B_[2]^[1]*C_[1]^[-2]*C_[2]^[1]*D_[1]^[1]*E_[1]^[1]*x^[2]', '(-1.0)*B_[1]^[1]*C_[1]^[-2]*C_[2]^[1]*D_[1]^[1]*E_[2]^[1]*x^[2]', '(-1.0)*C_[1]^[-2]*C_[2]^[1]*D_[1]^[1]*E_[1]^[1]*E_[2]^[1]*x^[1]', '(-2.0)*A_[2]^[1]*C_[1]^[-1]*C_[2]^[1]*D_[1]^[1]*x^[3]', '(-2.0)*C_[1]^[-1]*C_[2]^[1]*D_[1]^[1]*D_[2]^[1]*x^[2]', '(-2.0)*C_[1]^[-1]*C_[2]^[1]*D_[1]^[1]*F_[2]^[1]*x^[1]', '(1.0)*C_[1]^[-2]*C_[2]^[2]*F_[1]^[2]', '(-1.0)*B_[1]^[1]*B_[2]^[1]*C_[1]^[-2]*C_[2]^[1]*F_[1]^[1]*x^[2]', '(-1.0)*B_[2]^[1]*C_[1]^[-2]*C_[2]^[1]*E_[1]^[1]*F_[1]^[1]*x^[1]', '(-1.0)*B_[1]^[1]*C_[1]^[-2]*C_[2]^[1]*E_[2]^[1]*F_[1]^[1]*x^[1]', '(-1.0)*C_[1]^[-2]*C_[2]^[1]*E_[1]^[1]*E_[2]^[1]*F_[1]^[1]', '(-2.0)*A_[2]^[1]*C_[1]^[-1]*C_[2]^[1]*F_[1]^[1]*x^[2]', '(-2.0)*C_[1]^[-1]*C_[2]^[1]*D_[2]^[1]*F_[1]^[1]*x^[1]', '(-2.0)*C_[1]^[-1]*C_[2]^[1]*F_[1]^[1]*F_[2]^[1]', '(-1.0)*A_[2]^[1]*B_[1]^[1]*B_[2]^[1]*C_[1]^[-1]*x^[4]', '(-1.0)*B_[1]^[1]*B_[2]^[1]*C_[1]^[-1]*D_[2]^[1]*x^[3]', '(-1.0)*B_[1]^[1]*B_[2]^[1]*C_[1]^[-1]*F_[2]^[1]*x^[2]', '(-1.0)*A_[2]^[1]*B_[2]^[1]*C_[1]^[-1]*E_[1]^[1]*x^[3]', '(-1.0)*B_[2]^[1]*C_[1]^[-1]*D_[2]^[1]*E_[1]^[1]*x^[2]', '(-1.0)*B_[2]^[1]*C_[1]^[-1]*E_[1]^[1]*F_[2]^[1]*x^[1]', '(-1.0)*A_[2]^[1]*B_[1]^[1]*C_[1]^[-1]*E_[2]^[1]*x^[3]', '(-1.0)*B_[1]^[1]*C_[1]^[-1]*D_[2]^[1]*E_[2]^[1]*x^[2]', '(-1.0)*B_[1]^[1]*C_[1]^[-1]*E_[2]^[1]*F_[2]^[1]*x^[1]', '(-1.0)*A_[2]^[1]*C_[1]^[-1]*E_[1]^[1]*E_[2]^[1]*x^[2]', '(-1.0)*C_[1]^[-1]*D_[2]^[1]*E_[1]^[1]*E_[2]^[1]*x^[1]', '(-1.0)*C_[1]^[-1]*E_[1]^[1]*E_[2]^[1]*F_[2]^[1]', '(1)*A_[2]^[2]*x^[4]', '(2)*A_[2]^[1]*D_[2]^[1]*x^[3]', '(2)*A_[2]^[1]*F_[2]^[1]*x^[2]', '(1)*D_[2]^[2]*x^[2]', '(2)*D_[2]^[1]*F_[2]^[1]*x^[1]', '(1)*F_[2]^[2]', '(1.0)*A_[1]^[1]*B_[2]^[2]*C_[1]^[-1]*x^[4]', '(1.0)*B_[2]^[2]*C_[1]^[-1]*D_[1]^[1]*x^[3]', '(1.0)*B_[2]^[2]*C_[1]^[-1]*F_[1]^[1]*x^[2]', '(2.0)*A_[1]^[1]*B_[2]^[1]*C_[1]^[-1]*E_[2]^[1]*x^[3]', '(2.0)*B_[2]^[1]*C_[1]^[-1]*D_[1]^[1]*E_[2]^[1]*x^[2]', '(2.0)*B_[2]^[1]*C_[1]^[-1]*E_[2]^[1]*F_[1]^[1]*x^[1]', '(1.0)*A_[1]^[1]*C_[1]^[-1]*E_[2]^[2]*x^[2]', '(1.0)*C_[1]^[-1]*D_[1]^[1]*E_[2]^[2]*x^[1]', '(1.0)*C_[1]^[-1]*E_[2]^[2]*F_[1]^[1]']; #这整个是一个和为零的多项式 #如果某一个方程没有二次项,适用这套系数 elif (C_1 == 0 and B_1 == 0 and A_1 == 0): if (E_1 != 0): coefArray = ['(1)*A_[2]^[1]*x^[2]', '(1)*D_[2]^[1]*x^[1]', '(1)*F_[2]^[1]', '(-1)*B_[2]^[1]*D_[1]^[1]*E_[1]^[-1]*x^[2]', '(-1)*B_[2]^[1]*E_[1]^[-1]*F_[1]^[1]*x^[1]', '(1)*C_[2]^[1]*D_[1]^[2]*E_[1]^[-2]*x^[2]', '(2)*C_[2]^[1]*D_[1]^[1]*E_[1]^[-2]*F_[1]^[1]*x^[1]', '(1)*C_[2]^[1]*E_[1]^[-2]*F_[1]^[2]']; else: print('无穷多解或无解。'); return []; elif (C_1 == 0 and B_1 == 0 and A_1 == 0 and C_2 == 0 and B_2 == 0 and A_2 == 0): if (E_1 != 0): coefArray = ['(-1)*D_[2]^[1]*x^[1]', '(-1)*F_[2]^[1]', '(-1)*D_[1]^[1]*E_[1]^[-1]*E_[2]^[1]*x^[1]', '(-1)*E_[1]^[-1]*E_[2]^[1]*F_[1]^[1]']; else: print('无穷多解或无解。'); return []; else: print('或许需要调换位置,保证第一个方程的y^[2]的系数存在,可调换x和y参数实现。'); print('如果两个方程中找不出一个x^[2]或y^[2],则可以考虑消去xy项得一次方程组。'); #赋值系数,应该有12个 len_ = len(valueMap); size = len(coefArray); result = []; for i in range(size): s = coefArray[i]; #由于字母排序原因,一般x会排在最后,各系数ABCDEF会排在前面, #这会带来一些方便 index = s.find('x'); if (index != -1): #系数部分 part1 = s[:index-1]; #参数x部分 part2 = s[index-1:]; else: part1 = s; part2 = ''; for j in range(len_): part1 = part1.replace(valueMap[j][0], '('+str(valueMap[j][1])+')'); part1 = part1.replace('^[', '**('); part1 = part1.replace(']', ')'); #print(part1); part1 = '('+str(eval(part1))+')'; result.append(part1+part2); #print(result); result = alg.strcombine(result); #print(result); coef_x = self.coefPoly(result, 'x'); print('系数数组:', coef_x); roots = np.roots(coef_x); print('解: ', roots); return roots; #填充二元二次方程组的系数阵列,一共十二个 def coefFill(self, functions, element1 = 'x', element2 = 'y'): #functions是两个方程的多项式组成的数组[fun1, func2], #具有格式化后的多项式样式fun1, 2 = [mono1, mono2, ...] func1 = functions[0]; func2 = functions[1]; if (element1 != 'x'): for i in range(len(func1)): func1[i] = func1[i].replace(element1, 'x'); for i in range(len(func2)): func2[i] = func2[i].replace(element1, 'x'); if (element2 != 'y'): for i in range(len(func1)): func1[i] = func1[i].replace(element2, 'y'); for i in range(len(func2)): func2[i] = func2[i].replace(element2, 'y'); ''' #第一个方程 expr_1 = alg.strformat(['A_[1]x^[2]', 'B_[1]xy', 'C_[1]y^[2]', 'D_[1]x', 'E_[1]y', 'F_[1]']); #第二个方程 expr_2 = alg.strformat(['A_[2]x^[2]', 'B_[2]xy', 'C_[2]y^[2]', 'D_[2]x', 'E_[2]y', 'F_[2]']); ''' #用参数值填充,注意按照同类项来填系数 valMap = [['A_[1]', 0], ['B_[1]', 0],['C_[1]', 0], ['D_[1]', 0], ['E_[1]', 0],['F_[1]', 0], ['A_[2]', 0], ['B_[2]', 0],['C_[2]', 0], ['D_[2]', 0], ['E_[2]', 0],['F_[2]', 0]]; coefs = len(valMap); cycle = 0; for i in range(len(func1)): s = func1[i]; xIndex = s.find('x'); yIndex = s.find('y'); if (xIndex != -1): if (yIndex != -1): min_ = min(xIndex, yIndex); else: min_ = xIndex; else: if (yIndex != -1): min_ = yIndex else: min_ = -1; if (min_ != -1): #参数式 s_1 = s[min_:]; #系数 s_2 = s[:min_-1]; else: s_1 = ''; s_2 = s; if (s_1 == 'x^[2]'): valMap[0+cycle*6][1] = eval(s_2); elif (s_1 == 'x^[1]y^[1]' or s_1 == 'xy' ): valMap[1+cycle*6][1] = eval(s_2); elif (s_1 == 'y^[2]'): valMap[2+cycle*6][1] = eval(s_2); elif (s_1 == 'x^[1]' or s_1 == 'x'): valMap[3+cycle*6][1] = eval(s_2); elif (s_1 == 'y^[1]' or s_1 == 'y'): valMap[4+cycle*6][1] = eval(s_2); elif (s_1 == ''): valMap[5+cycle*6][1] = eval(s_2); cycle = 1; for i in range(len(func2)): s = func2[i]; xIndex = s.find('x'); yIndex = s.find('y'); if (xIndex != -1): if (yIndex != -1): min_ = min(xIndex, yIndex); else: min_ = xIndex; else: if (yIndex != -1): min_ = yIndex else: min_ = -1; if (min_ != -1): #参数式 s_1 = s[min_:]; #系数 s_2 = s[:min_-1]; else: s_1 = ''; s_2 = s; if (s_1 == 'x^[2]'): valMap[0+cycle*6][1] = eval(s_2); elif (s_1 == 'x^[1]y^[1]' or s_1 == 'xy' ): valMap[1+cycle*6][1] = eval(s_2); elif (s_1 == 'y^[2]'): valMap[2+cycle*6][1] = eval(s_2); elif (s_1 == 'x^[1]' or s_1 == 'x'): valMap[3+cycle*6][1] = eval(s_2); elif (s_1 == 'y^[1]' or s_1 == 'y'): valMap[4+cycle*6][1] = eval(s_2); elif (s_1 == ''): valMap[5+cycle*6][1] = eval(s_2); return valMap;</span>
现在的工具完整度已经达到可以解80%以上最高次是二次的二元方程组了。
也就是说最多只能是二元,可以是一次,或者二次,并且还没有穷尽所有系数配置。
不过一般来说,应该够用了,至少,所有圆锥曲线,直线这块是没问题了。
可惜只能在平面内,到了空间就是三元了。
看一个直线和椭圆交点的测试:
<span style="font-size:18px;">#测试 def tmp12(): solve = StringAlgSolve(); #直线方程 function_1 = alg.strformat(['x', '1/4y', '-1']); #圆方程 function_2 = alg.strformat(['1/4x^[2]', '1/16y^[2]', '-1']); print('step1: ', function_1); print('step1: ', function_2); valMap = solve.coefFill([function_1, function_2]); print(valMap); #解出的x的根 roots = solve.solveEquationExp2_2(valMap); #两个方程 f = function_1; print('step1: ', f); g = function_2; print('step1: ', g); #以下部分是定式,可以不加改动 poly_y_f = solve.coefArray(f, 'y'); print('step2: ', poly_y_f); poly_y_g = solve.coefArray(g, 'y'); print('step2: ', poly_y_g); #求方程式<1>的y关于x的表达式 expr_y_root = solve.solvePoly(poly_y_f); print('step3: ', expr_y_root); expr_y_root2 = solve.solvePoly(poly_y_g); print('step3: ', expr_y_root2); #求相交点的坐标对组 points = []; points2 = []; for i in range(len(roots)): real = abs(roots[i].real); abs_ = abs(roots[i]); #实数根 if abs(real-abs_) < 0.001: for j in range(len(expr_y_root)): x = roots[i].real; y = solve.strEval(expr_y_root[j], 'x', x); points.append([x, y]); y = solve.strEval(expr_y_root2[j], 'x', x); points2.append([x, y]); print(points); print(points2); print('step4: '); for i in range(len(points)): if (abs(points[i][0]-points2[i][0]) < 1e-3 and abs(points[i][1]-points2[i][1])<1e-3): print('相交点:[{0}, {1}]'.format(round(points[i][0], 3), round(points[i][1], 3))); </span>
结果:
这里还是有一点小问题,因为明明是两个交点,却只给出了一个,这个先放着。
本节到此结束,欲知后事如何,请看下回分解。
注:阿伟来预测一下2016年的高考难度:5.5环 难度 概率 80%; 6环难度, 概率10%, 5环难度10%,
诸位道友依据5.5环难度制定应对策略,应该没什么问题,如果碰到变态的6环难度,那就是命不好了。