[从头学数学] 第224节 带着计算机去高考(十六)

剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼。设想一个场景:
如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗
?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉。

正剧开始:

星历2016年05月26日 16:49:14, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起做着2015年的江苏省数学高考题]。


这一节是是[工程师阿伟]带着[机器小伟]去怀旧高考的收关节点。

所以多少会做几个题来表表心意。


这一年的题难度并不高,大部分很简单,只有少数几个难题撑撑门面,

阿伟给评为5.0环难度,比前几年都要低。


[从头学数学] 第224节 带着计算机去高考(十六)_第1张图片


说到高考,重新看了这么多年的高考题,阿伟确立了自己的观点:高考题其实是以调戏大家为目的的。

事实上,这些题在生产、生活中很少有真正派上用场的,也就是说,到了现实生活,你会用其它办法去

获取你需要的数据,而不会有人给自己下套来这样调戏自己的。


打个比方,如果你有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>


[从头学数学] 第224节 带着计算机去高考(十六)_第2张图片



<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>

[从头学数学] 第224节 带着计算机去高考(十六)_第3张图片


<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>

[从头学数学] 第224节 带着计算机去高考(十六)_第4张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第5张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第6张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第7张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第8张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第9张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第10张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第11张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第12张图片



[从头学数学] 第224节 带着计算机去高考(十六)_第13张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第14张图片


试卷贴完了,下面还是贴一下关于解二元二次方程组的后续补充吧。


上一节的解决方案不够全面,还没有考虑到一次式和二次式的交点,以及一次式的交点。

下面进行了补全。



[从头学数学] 第224节 带着计算机去高考(十六)_第15张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第16张图片


来看一下两个椭圆交点的测试:

<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>

[从头学数学] 第224节 带着计算机去高考(十六)_第17张图片


<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>


结果:

[从头学数学] 第224节 带着计算机去高考(十六)_第18张图片


[从头学数学] 第224节 带着计算机去高考(十六)_第19张图片


这里还是有一点小问题,因为明明是两个交点,却只给出了一个,这个先放着。


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


注:阿伟来预测一下2016年的高考难度:5.5环 难度 概率 80%;  6环难度, 概率10%, 5环难度10%,

诸位道友依据5.5环难度制定应对策略,应该没什么问题,如果碰到变态的6环难度,那就是命不好了。



你可能感兴趣的:([从头学数学] 第224节 带着计算机去高考(十六))