[從頭學數學] 第222節 帶著電腦去高考(十四)

來源:互聯網
上載者:User

標籤:

劇情提要:
[機器小偉]在[工程師阿偉]的陪同下進入了[九轉金丹]之第八轉的修鍊。設想一個情境:
如果允許你帶一台不連網的電腦去參加高考,你會放棄選擇一個手拿計算機和草稿本嗎
?阿偉決定和小偉來嘗試一下用電腦算高考題會是怎樣的感覺。

正劇開始:

星曆2016年05月25日 17:14:22, 銀河系厄爾斯星球中華帝國江南行省。
[工程師阿偉]正在和[機器小偉]一起做著2013年的江蘇省數學高考題]。


上面這句話確實在本文而言是名不符實的,因為這張卷子阿偉和[機器小偉]

誰也沒做,純粹貼題了。


粗略看了一下,難度還是5.5環,也就是屬於很難的那個行列。試想你每次

為了取得一件寶物都不得不受到5.5次調戲的那種感覺吧,就是這樣。
























































當年阿偉從來沒敢交過白卷,現在膽也肥了,也敢交白卷了,真是非常瀟洒的感覺。


這次呢,阿偉和[機器小偉]主要在研究怎樣解二元二次方程組,先看這個測試題吧:







這兩條曲線就是這麼個圖:




之所以能解二元二次方程組,是因為它們係數之中滿足這樣的關係:




<span style="font-size:18px;">>>> ['(0)', '(2)*b_[1]^[1]*b_[2]^[1]', '(0)', '(4)*c_[1]^[1]', '(4)*c_[2]^[1]']['(4)*b_[1]^[2]*b_[2]^[2]', '(-16)*b_[1]^[2]*c_[2]^[1]', '(-16)*b_[2]^[2]*c_[1]^[1]', '(64)*c_[1]^[1]*c_[2]^[1]']['(0)', '(0)', '(0)', '(0)', '(4)*b_[1]^[2]*b_[2]^[2]', '(16)*b_[1]^[1]*b_[2]^[1]*c_[1]^[1]', '(16)*b_[1]^[1]*b_[2]^[1]*c_[2]^[1]', '(16)*c_[1]^[2]', '(32)*c_[1]^[1]*c_[2]^[1]', '(16)*c_[2]^[2]']['(0)', '(0)', '(16)*b_[1]^[1]*b_[2]^[1]*c_[1]^[1]', '(16)*b_[1]^[1]*b_[2]^[1]*c_[2]^[1]', '(16)*c_[1]^[2]', '(-32)*c_[1]^[1]*c_[2]^[1]', '(16)*c_[2]^[2]', '(16)*b_[1]^[2]*c_[2]^[1]', '(16)*b_[2]^[2]*c_[1]^[1]']#測試,二元二次方程組的根的恒等式,已消去一元#先要保證兩個方程的消去的那個元的最高次項係數為1def tmp3():    part1 = alg.strformat(['b_[1]', 'b_[2]']);    part2 = alg.strformat(['b_[1]^[2]', '-4c_[1]']);    part3 = alg.strformat(['b_[2]^[2]', '-4c_[2]']);    part4 = alg.strpow_n(part1, 2);    part5 = alg.stradd(part2, part3);    part6= alg.strcombine(alg.stradd(part4, alg.minus(part5)));    #print(part6);    part7 = alg.strdot(alg.strdot(['(4)'], part2), part3);    part7 = alg.strcombine(part7);    #print(part7);    part8 = alg.strpow_n(part6, 2);    part8 = alg.strcombine(part8);    #print(part8);    result = alg.strcombine(alg.stradd(part8, alg.minus(part7)));    print(result);>>> ['(0.0)', '(0.0)', '(1.0)*b_[1]^[1]*b_[2]^[1]*c_[1]^[1]', '(1.0)*b_[1]^[1]*b_[2]^[1]*c_[2]^[1]', '(1.0)*c_[1]^[2]', '(-2.0)*c_[1]^[1]*c_[2]^[1]', '(1.0)*c_[2]^[2]', '(1.0)*b_[1]^[2]*c_[2]^[1]', '(1.0)*b_[2]^[2]*c_[1]^[1]']</span>

<span style="font-size:18px;">var s = ['在a_[1] == a_[2] == 1時','((b_[1]-b_[2])^[2]-(b_[1]^[2]-4c_[1]+b_[2]^[2]-4c_[2]))^[2]','== 4(b_[1]^[2]-4c_[1])(b_[2]^[2]-4c_[2])',' ','這個恒等式可以化為:','(1)*b_[1]*b_[2]*c_[1]+(1)*b_[1]*b_[2]*c_[2]', '+(1)*c_[1]^[2]-(2)*c_[1]*c_[2]+(1)*c_[2]^[2]', '+(1)*b_[1]^[2]*c_[2]+(1)*b_[2]^[2]*c_[1]',' = 0'];</span>


再給工具中新添兩個方法:

<span style="font-size:18px;">   #把一個只包括+號的多項式字串拆分成多項式數組    #如'(1)*x^[2]+(-1)' => ['(1)*x^[2]', '(-1)']    def str2Array(self, str1):        array = [];        #加號位置        signIndex = str1.find('+');        print(signIndex);        start = 0;        count = 0;        while (signIndex != '-1' and count < 10):            #符合要求的必須連著下一個單項式的係數            #按照統一格式是左括弧開始            if str1[signIndex+1] == '(':                array.append(str1[start:signIndex]);                start = signIndex + 1;            signIndex = str1.find('+', signIndex+1);            if (signIndex == -1):                break;        array.append(str1[start:]);        return array;>>> 9['(1)*x^[2]', '(-1)']    #解二元二次方程組    def solveEquationExp2(self, array1, array2):        #輸入的是兩個係數矩陣        #矩陣具有這樣的形式:[['1'], [b_[1]], [c_[1]]]        #也就是對於ax^[2]+bx+c=0來說, a=1, 而b, c是帶參數多項式數組        #注意,係數是數組,不是字串等。        a_1, b_1, c_1 = array1[0], array1[1], array1[2];        a_2, b_2, c_2 = array2[0], array2[1], array2[2];        #恒等式        '''        [        '(1.0)*b_[1]^[1]*b_[2]^[1]*c_[1]^[1]',        '(1.0)*b_[1]^[1]*b_[2]^[1]*c_[2]^[1]',        '(1.0)*c_[1]^[2]',        '(-2.0)*c_[1]^[1]*c_[2]^[1]',        '(1.0)*c_[2]^[2]',        '(1.0)*b_[1]^[2]*c_[2]^[1]',        '(1.0)*b_[2]^[2]*c_[1]^[1]'] = 0        '''        #這些運算都是針對數組的        b1b2 = alg.strcombine(alg.strdot(b_1, b_2));        c1c2 = alg.strcombine(alg.strdot(c_1, c_2));        c12 = alg.strcombine(alg.strpow_n(c_1, 2));        c22 = alg.strcombine(alg.strpow_n(c_2, 2));        b12 = alg.strcombine(alg.strpow_n(b_1, 2));        b22 = alg.strcombine(alg.strpow_n(b_2, 2));                part1 = alg.strcombine(alg.strdot(b1b2, alg.stradd(c_1, c_2)));        part2 = alg.strcombine(c12+alg.strdot(['(-2)'], c1c2)+c22);        part3 = alg.strcombine(alg.stradd(alg.strdot(b12, c_2),                                          alg.strdot(b22, c_1)));        result = alg.strcombine(part1+part2+part3);        return result;</span>


這樣就可以進行套路化的解題了:


<span style="font-size:18px;">>>> step1:  ['(1)*x^[2]', '(1)*y^[2]', '(2)*x*y', '(-1)']step2:  ['(1)', '(2)*x', '(1)*x^[2]+(-1)']step1:  ['(1)*x^[2]', '(4)*y^[2]', '(-1)']step2:  ['(4)', '0', '(1)*x^[2]+(-1)']step3:  ['(1)'] ['(2)*x'] ['(1)*x^[2]', '(-1)']step3:  ['(4)'] ['0'] ['(1)*x^[2]', '(-1)']step4:  ['(0)', '(4)*x^[4]', '(-4)*x^[2]']step5:  [4, 0, -4, 0, 0]step6:  [ 1. -1.  0.  0.]step7:  ['(((-((2)*x)))+(((((2)*x)^[2])+((-4)*(((1))*((1)*x^[2]+(-1)))))^[0.5]))/((2)*((1)))', '(((-((2)*x)))-(((((2)*x)^[2])+((-4)*(((1))*((1)*x^[2]+(-1)))))^[0.5]))/((2)*((1)))']step8:  [[1.0, 0.0], [1.0, -2.0], [0.0, 1.0], [0.0, -1.0], [0.0, 1.0], [0.0, -1.0]]#測試def tmp2():    solve = StringAlgSolve();    f = alg.strformat(['x^[2]', 'y^[2]', '2xy', '-1']);    print('step1: ', f);    poly_y_f = solve.coefArray(f, 'y');    print('step2: ', poly_y_f);    #以y為參數的二次多項式的係數,消元是消y    a1, b1, c1 = poly_y_f[0], poly_y_f[1], poly_y_f[2];    g = alg.strformat(['x^[2]', '4y^[2]', '-1']);    print('step1: ', g);    poly_y_g = solve.coefArray(g, 'y');    print('step2: ', poly_y_g);    #以y為參數的二次多項式的係數,消元是消y    a2, b2, c2 = poly_y_g[0], poly_y_g[1], poly_y_g[2];        a1, b1, c1 =solve.str2Array(a1), solve.str2Array(b1),solve.str2Array(c1)    a2, b2, c2 =solve.str2Array(a2), solve.str2Array(b2),solve.str2Array(c2)    print('step3: ', a1, b1, c1);    print('step3: ', a2, b2, c2);    poly_x = solve.solveEquationExp2([a1, b1, c1], [a2, b2, c2]);    print('step4: ', poly_x);    poly_x = solve.coefPoly(poly_x, 'x');    print('step5: ', poly_x);    #求得x的根    roots = np.roots(poly_x);    print('step6: ', roots);    #求方程式<1>的y關於x的運算式    expr_y_root = solve.solvePoly(poly_y_f);    print('step7: ', expr_y_root);    expr_y_root2 = solve.solvePoly(poly_y_g);    print('step7: ', 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];                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('step8: ', points);    print('step8: ', points2);    #比較兩組點,得出交點[1, 0], [-1, 0]</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 = 0.4, spaceY = 0.4;                   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+y = 1', f2 = 'x+y=-1', f3 = 'x^[2]+4y^[2] = 1', f4 = '';                              //函數描點            //參數方程          var x, y;          var pointA = [];                    for (var thita = 0; thita < Math.PI*2; thita +=Math.PI/48) {  x = Math.cos(thita);a.push([x, 1-x]);b.push([x, -1-x]);            c.push([Math.cos(thita), 0.5*Math.sin(thita)]);          }                                      //存放臨時數組                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, 'red');                        tmp = [].concat(b);                        shape.multiLineDraw(tmp, 'green');                                            plot.setFillStyle('green');                    plot.fillText(f2, 100, -120, 200);                  }  //顯示變換                if (c.length > 0) {                    c = transform.scale(transform.translate(c, 0, 0), scaleX/spaceX, scaleY/spaceY);                     //函數1                    tmp = [].concat(c);                        shape.pointDraw(tmp, 'blue');                        tmp = [].concat(c);                        shape.multiLineDraw(tmp, '#0088FF');                                            plot.setFillStyle('blue');                    plot.fillText(f3, 100, -150, 200);                  }                }</span>


<span style="font-size:18px;">//測試if (1) {var mathText = new MathText();//希臘字母表(存此用於Ctrl C/V//ΑΒΓΔΕΖΗ ΘΙΚΛΜΝΞ ΟΠΡ ΣΤΥ ΦΧΨ Ω//αβγδεζη θικλμνξ οπρ στυ φχψ ω//希臘大小寫字母var Gc = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ';var Gs = 'αβγδεζηθικλμνξοπρστυφχψω';var s = [/*'測試題:求交點','x^[2]+2xy+y^[2]=1 _[(1)]','x^[2]+4y^[2] = 1  _[(2)]',' ','step1: 兩曲線的多項式','step2: 消去y元','step3: 將兩組二次係數匯入方程恒等式','step4: 得到方程恒等式,這是關於元x的四次恒等式,不含根號','step5: 匯出恒等式的係數陣列。',*/'step6: 解恒等式的根,有四個根。','step7: 求得曲線方程中y元關於x元的根的代數式。','step8: 把代數式求值,得到交點座標'];</span>


從此以後,[機器小偉]就可以縱橫圓錐曲線了。

留個快照吧:



現在阿偉真的很爽,覺得外邊的風景也漂亮起來了。


本節到此結束,欲知後事如何,請看下回分解。


註:本節中的解法雖然沒錯,但最後結果卻是錯的,原因出在那個恒等式不夠強大,

由於時間不夠,雖然阿偉意識到解錯了,也沒辦法,在下一節中會給出正確的解法

以及結果,大家可以去查看。當然,知道這樣解是得不出正確結果,也是一種收穫。



[從頭學數學] 第222節 帶著電腦去高考(十四)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.