剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼。设想一个场景:
如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗
?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉。
正剧开始:
星历2016年05月17日 16:48:27, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起做着2001年的江苏省数学高考题]。
<span style="font-size:18px;">#题1 >>> 1 1 1 3 def tmp1(): #定特例 angle = math.pi/4; for i in range(1,2): for n in range(4): angle_1 = angle+math.pi/2*n sini = math.sin(i*angle_1); cos = math.cos(angle_1); if (sini*cos > 0): print(i, n+1);</span>
<span style="font-size:18px;">#题2 def tmp2(): ''' s1 = '(x-1)^[2]+(y+1)^[2]-(x+1)^[2]-(y-1)^[2] = 0'; s2 = 'y = (2-x)'; val1 = ['x', '-1']; val2 = ['y', '1']; val3 = ['x', '1']; val4 = ['y', '-1']; a = strpow_n(val1, 2)+strpow_n(val2, 2)+minus(strpow_n(val3, 2))+minus(strpow_n(val4, 2)); a = strcombine(a); print(a); #['(0)', '(-4)*x', '(0)', '(0)', '(4)*y'] #-4x+8-4x=0 ''' #两条直线的交点 A = [1, -1]; B = [-1, 1]; C = [0, 2]; D = [1, 1]; cross = geo.crossPointOfTwoLine([A, B], [C, D]); #print(cross); #平行 #AB距离 d1 = geo.distance2D(A, B); #2.8284271247461903 #两平行线的距离 d = geo.lineDistance2D([A, B], [C, D]); print(d); #1.414213562373095 #半经 R = ((d1/2)**2+d**2)**0.5; print('R = ', R); #求AB的中垂线方程 line = geo.perpendicular([A, B]); print(line); #[[0.0, 0.0], [10.0, 10.0]] #求中垂线与圆心所在直线的交点 cross = geo.crossPointOfTwoLine([line[0], line[1]], [C, D]); print(cross); #[1.0, 1.0] #这是一个R=2, 圆心(1, 1)的方程</span>
<span style="font-size:18px;">#题3 def tmp3(): #4*(4-d)*(4+d) = 48</span>
<span style="font-size:18px;">//题5 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.5, spaceY = 0.5; 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 = 'ρ = 2sin(θ+pi/4)', f2 = '', f3 = '', f4 = ''; //函数描点 //参数方程 var x, y; var pointA = []; for (var thita = 0; thita < Math.PI*2; thita +=Math.PI/24) { pointA = [2*Math.sin(thita+Math.PI/4), thita]; a.push(polar2XY(pointA)); } //存放临时数组 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, -180, 200); } }</span>
<span style="font-size:18px;">#题6 >>> math.acos(0); 1.5707963267948966 >>> math.acos(1); 0.0 >>> math.acos(-1); 3.141592653589793</span>
<span style="font-size:18px;">#题8 >>> A def tmp8(): a = math.pi/8; b = math.pi/6; cond1 = math.sin(a)+ math.cos(a); cond2 = math.sin(b) + math.cos(b); a = cond1; b = cond2; if (a<b): print('A'); if (a > b): print('B'); if (a*b < 1): print('C'); if (a*b > 2): print('D'); </span>
<span style="font-size:18px;">//题9 if (1) { var r = 20; config.setSector(1,1,1,1); config.graphPaper2D(0, 0, r); config.axis2D(0, 0, 180); var scale = 3*r; var triangle = new Triangle(); var transform = new Transform(); var array = triangle.solve([3.464, 2.45, 2.45, '?', '?', '?']); shape.angleDraw(transform.translate(array, -200/scale, 0), 'red', scale, ['B', 'D', 'C\'']); //shape.areaDraw(array, 'red', scale); //document.write(array+'<br/>'); }</span>
<span style="font-size:18px;">#题11 def tmp11(): S_1 = a*b/math.cos(thita); S_2 = a*b/math.cos(thita); S_3 = 0.5*b*b/math.cos(thita) + (a+a-b/2)*b/math.cos(thita); #相等</span>
<span style="font-size:18px;">#题14 def tmp14(): c = 5; #[(9+(9/16)*y^[2])^[0.5], y], [-5, 0], [5, 0] #y^[2]+25 = x^[2]; #x^[2] =9+(9/16)y^[2] #a1 - a2 = 6; #a1^[2] + a2^[2] = 100; t1 = strpow_n(['6', 'a_2'], 2); t2 = strmono('a_[1]^[2]'); t1 = strcombine(t1); print(t1); if (1) { var equation = new Equation(); var a = [2, 12, 36-100] equation.quadratic(a); } >>> 3.4*9.4/10 3.196 </span>
<span style="font-size:18px;">#题15 def tmp15(): #(1-q^[n+1])*2 = (1-q^[n])+(1-q^[n+2] Q[1, -2, 1] if (1) { var equation = new Equation(); var a = [1, -2, 1] equation.quadratic(a); } 方程 1x^[2] + -2x + 1 = 0 => Δ = b^[2] - 4ac = 0 ; 方程的解为:x1 = x2 = 1 ; 方程根与系数的关系:x1 + x2 = 2, x1 * x2 = 1 ;</span>
有2n个点,每个点作为直角顶点,另一个点可以在半圆里除它以外再找一个。
<span style="font-size:18px;">#题17 def tmp17(): SA = AB = BC = 1; AD = 1/2; V_S_ABCD = (AD+BC)*AB/2*SA/3; print('V= ', V_S_ABCD); #平面ABCD中CD上的高DE CD = (AD**2+AB**2)**0.5; DE = CD/AB*AD; #AE AE = AD/CD*DE; SD = (SA**2+AD**2)**0.5; SE = (SA**2+AE**2)**0.5; print('DE = ', DE); print('SD = ', SD); print('SE = ', SE); print('AE = ', AE); #F点为AB和CD的延长线交点,G为D作的SF的垂线 SF = (SA**2+AB**2)**0.5; DG = SD*CD/SF; AG = SA*AB/SF; print('SF = ', SF); print('DG = ', DG); print('AG = ', AG);</span>
<span style="font-size:18px;">>>> V= 0.25 DE = 0.5590169943749475 SD = 1.118033988749895 SE = 1.0307764064044151 AE = 0.25 SF = 1.4142135623730951 DG = 0.8838834764831845 AG = 0.7071067811865475 >>> math.atan(0.707); 0.6154085176292563 >>> 180*_/math.pi 35.2603107365587 var array = triangle.solve([0.884, 0.707, 0.5, '?', '?', '?']); shape.angleDraw(transform.translate(array, -200/scale, 0), 'red', scale, ['A', 'D', 'G']); </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 scale = 8*r; var triangle = new Triangle(); var transform = new Transform(); var array = triangle.solve([0.559, 1.118, 1.030, '?', '?', '?']); shape.angleDraw(transform.translate(array, -200/scale, 0), 'red', scale, ['S', 'E', 'D']); //shape.areaDraw(array, 'red', scale); //document.write(array+'<br/>'); }</span>
<span style="font-size:18px;">#题18 def tmp18(): z = complex(0, 1)*pow(complex(1, -1), 3); print(z); real = z.real; print(real); image = z.imag; print(180/math.pi*math.atan(image/real)); >>> (2-2j) 2.0 -0.7853981633974483 (2-2j) 2.0 -45.0 >>> (2+0.707)*1.414 3.8276979999999994</span>
贴一下用到的工具,一部分是代数式的,一部分是几何的,以防遗漏
<span style="font-size:18px;">### # @usage 代数式字符串的运算 # @author mw # @date 2016年05月17日 星期二 16:48:56 # @param # @return # ### #计算代数式用, 传入的是单项式,返回coef*expr的形式 def strmono(s): #'x', '-x', '2x', '-2x', '-2x^[2]', '3x_[2]^[3]', '-3x_[2]^[3]' stmp = s; size = len(stmp); alphaIndex = 0; signIndex = 0; for i in range(size): if (stmp[i].isalpha()): alphaIndex = i; break; if (i >= size-1): alphaIndex = i+1; if (stmp[0] == '-'): signIndex = 1; if (signIndex >= alphaIndex): return '(-1)*'+stmp[alphaIndex:]; else: if alphaIndex >= size: return '(-'+stmp[signIndex:alphaIndex]+')'; return '(-'+stmp[signIndex:alphaIndex]+')*'+stmp[alphaIndex:]; else: signIndex = 0; if (signIndex >= alphaIndex): return '(1)*'+stmp[alphaIndex:]; else: if alphaIndex >= size: return '('+stmp[signIndex:alphaIndex]+')'; return '('+stmp[signIndex:alphaIndex]+')*'+stmp[alphaIndex:]; #计算两个单项式的乘积 def strmul(mono1, mono2): #这个处理是保证每个单项式统一格式(coef)*expr ''' stmp1 = strmono(s1); stmp2 = strmono(s2); ''' if (mono1[0] != '(' or mono2[0] != '('): #如果没有规格化,那么就做一下 mono1 = strmono(mono1); mono2 = strmono(mono2); else: stmp1 = mono1; stmp2 = mono2; #乘号的位置 signIndex1 = stmp1.find('*'); signIndex2 = stmp2.find('*'); if (signIndex1 == -1): coef1 = stmp1; expr1 = ''; else: coef1 = stmp1[:signIndex1]; expr1 = stmp1[signIndex1+1:]; if (signIndex2 == -1): coef2 = stmp2; expr2 = ''; else: coef2 = stmp2[:signIndex2]; expr2 = stmp2[signIndex2+1:]; coef = coef1+'*'+coef2; if (signIndex1 == -1 or signIndex2 == -1): expr = expr1+expr2; else: expr = expr1+'*'+expr2; if (expr == ''): return '('+str(round(eval(coef), 6))+')'; return '('+str(round(eval(coef), 6))+')*'+expr; #计算两个单项式的商 def strdiv(s1, s2): #这个处理是保证每个单项式统一格式(coef)*expr stmp1 = strmono(s1); stmp2 = strmono(s2); #乘号的位置 signIndex1 = stmp1.find('*'); signIndex2 = stmp2.find('*'); if (signIndex1 == -1): coef1 = stmp1; expr1 = ''; else: coef1 = stmp1[:signIndex1]; expr1 = stmp1[signIndex1+1:]; if (signIndex2 == -1): coef2 = stmp2; expr2 = ''; else: coef2 = stmp2[:signIndex2]; expr2 = stmp2[signIndex2+1:]; coef = coef1+'/'+coef2; if (signIndex1 == -1 and signIndex2 != -1): expr = '('+expr2+')^[-1]'; elif (signIndex1 == -1 or signIndex2 == -1): expr = expr1+expr2; else: expr = expr1+'/'+expr2; if (expr == ''): return '('+str(round(eval(coef), 6))+')'; return '('+str(round(eval(coef), 6))+')*'+expr; #找一个字符串中所有待查找子串的位置,返回位置阵列 def findall(string, sub): size = len(string); index = []; cur = string.find(sub); index.append(cur) while (index[-1] != -1): cur = string.find(sub, index[-1]+1); index.append(cur); return index; #计算单项式的乘方, s^n def strpow(s, n): stmp = strmono(s); signIndex = stmp.find('*'); if (signIndex == -1): coef = stmp+'**'+str(n); expr = ''; return '('+str(round(eval(coef), 6))+')'; else: coef = stmp[:signIndex]+'**'+str(n); expr = '('+stmp[signIndex+1:]+')^['+str(n)+']'; return '('+str(round(eval(coef), 6))+')*'+expr; #计算代数式用,传入的两个阵列都具有['s1', 's2', ..., 'sn']这样的格式 def strdot(array1, array2): size1 = len(array1); size2 = len(array2); result = []; for i in range(size1): for j in range(size2): result.append(strmul(array1[i], array2[j])); return result; #把格式化后的单项式分解成[coef, expr]对组的形式 def explodemono(mono): stmp = mono; #乘号的位置 signIndex = stmp.find('*'); if (signIndex == -1): coef = stmp; expr = ''; else: coef = stmp[:signIndex]; expr = stmp[signIndex+1:]; return [coef, expr]; #合并同类项,传入的阵列具有['s1', 's2', ..., 'sn']这样的格式 def strcombine(array): size = len(array); explode = []; for i in range(size): #这里传入的阵列已经是规格化后的了,否则要加一层strmono处理。 explode.append(explodemono(array[i])); result = []; for i in range(size): size_1 = len(result); if size_1 <= 0: result.append(explode[i]); else: for j in range(size_1): if result[j][1] == explode[i][1]: result[j][0] = result[j][0] + '+' + explode[i][0]; break; if j >= size_1-1: result.append(explode[i]); result_1 = []; size_1 = len(result); for j in range(size_1): result[j][0] = str(round(eval(result[j][0]), 6)); if (result[j][0] == '0'): result_1.append('(0)'); else: tmps = result[j][1]; if (tmps == ''): result_1.append('('+result[j][0]+')'); else: result_1.append('('+result[j][0]+')*'+result[j][1]); return result_1; #指数为正整数的乘方 def strpow_n(array, n): #进行格式化处理 s = []; for i in range(len(array)): s.append(strmono(array[i])); array = s; #计算 result = []; if (n == 1): result = array; elif (n == 2): result = strdot(array, array); elif (n == 3): tmp = strdot(array, array); result = strdot(tmp, array); return result; #阵列取负 def minus(array): for i in range(len(array)): if array[i][1] == '-': #array[i][0]是'(, 这是规范 array[i] = array[i][0]+array[i][2:]; else: array[i] = array[i][0]+'-'+array[i][1:]; return array; </span>
用例:
<span style="font-size:18px;">>>> (-3) (3) (1)*x (-1)*x (2)*x (-2)*x (-2)*x^[2] (3)*x_[2]^[3] (-3)*x_[2]^[3] #计算代数式用, 传入的是单项式,返回coef*expr的形式 def strmono(s): #'x', '-x', '2x', '-2x', '-2x^[2]', '3x_[2]^[3]', '-3x_[2]^[3]' stmp = s; size = len(stmp); alphaIndex = 0; signIndex = 0; for i in range(size): if (stmp[i].isalpha()): alphaIndex = i; break; if (i >= size-1): alphaIndex = i+1; if (stmp[0] == '-'): signIndex = 1; if (signIndex >= alphaIndex): return '(-1)*'+stmp[alphaIndex:]; else: if alphaIndex >= size: return '(-'+stmp[signIndex:alphaIndex]+')'; return '(-'+stmp[signIndex:alphaIndex]+')*'+stmp[alphaIndex:]; else: signIndex = 0; if (signIndex >= alphaIndex): return '(1)*'+stmp[alphaIndex:]; else: if alphaIndex >= size: return '('+stmp[signIndex:alphaIndex]+')'; return '('+stmp[signIndex:alphaIndex]+')*'+stmp[alphaIndex:]; if __name__ == '__main__': #tmp1(); s = ['-3', '3', 'x', '-x', '2x', '-2x', '-2x^[2]', '3x_[2]^[3]', '-3x_[2]^[3]']; for i in range(len(s)): print(strmono(s[i])); >>> (-9) (3)*x (-1)*x*x (-2)*x*x (-4)*x*x (4)*x*x^[2] (-6)*x^[2]*x_[2]^[3] (-9)*x_[2]^[3]*x_[2]^[3] #计算两个单项式的乘积 def strmul(s1, s2): #这个处理是保证每个单项式统一格式(coef)*expr stmp1 = strmono(s1); stmp2 = strmono(s2); #乘号的位置 signIndex1 = stmp1.find('*'); signIndex2 = stmp2.find('*'); if (signIndex1 == -1): coef1 = stmp1; expr1 = ''; else: coef1 = stmp1[:signIndex1]; expr1 = stmp1[signIndex1+1:]; if (signIndex2 == -1): coef2 = stmp2; expr2 = ''; else: coef2 = stmp2[:signIndex2]; expr2 = stmp2[signIndex2+1:]; coef = coef1+'*'+coef2; if (signIndex1 == -1 or signIndex2 == -1): expr = expr1+expr2; else: expr = expr1+'*'+expr2; if (expr == ''): return '('+str(round(eval(coef), 6))+')'; return '('+str(round(eval(coef), 6))+')*'+expr; if __name__ == '__main__': #tmp1(); s = ['-3', '3', 'x', '-x', '2x', '-2x', '-2x^[2]', '3x_[2]^[3]', '-3x_[2]^[3]']; for i in range(len(s)-1): print(strmul(s[i], s[i+1])); >>> (-1.0) (3.0)*(x)^[-1] (-1.0)*x/x (-0.5)*x/x (-1.0)*x/x (1.0)*x/x^[2] (-0.666667)*x^[2]/x_[2]^[3] (-1.0)*x_[2]^[3]/x_[2]^[3] (-1.0)*x_[2]^[3]/x_[2]^[3] (-1.5)*x_[2]^[3]/x^[2] (1.0)*x^[2]/x (-1.0)*x/x (-2.0)*x/x (-1.0)*x/x (0.333333)*x (-1.0) #计算两个单项式的商 def strdiv(s1, s2): #这个处理是保证每个单项式统一格式(coef)*expr stmp1 = strmono(s1); stmp2 = strmono(s2); #乘号的位置 signIndex1 = stmp1.find('*'); signIndex2 = stmp2.find('*'); if (signIndex1 == -1): coef1 = stmp1; expr1 = ''; else: coef1 = stmp1[:signIndex1]; expr1 = stmp1[signIndex1+1:]; if (signIndex2 == -1): coef2 = stmp2; expr2 = ''; else: coef2 = stmp2[:signIndex2]; expr2 = stmp2[signIndex2+1:]; coef = coef1+'/'+coef2; if (signIndex1 == -1 and signIndex2 != -1): expr = '('+expr2+')^[-1]'; elif (signIndex1 == -1 or signIndex2 == -1): expr = expr1+expr2; else: expr = expr1+'/'+expr2; if (expr == ''): return '('+str(round(eval(coef), 6))+')'; return '('+str(round(eval(coef), 6))+')*'+expr; if __name__ == '__main__': #tmp1(); s = ['-3', '3', 'x', '-x', '2x', '-2x', '-2x^[2]', '3x_[2]^[3]', '-3x_[2]^[3]']; for i in range(len(s)-1): print(strdiv(s[i], s[i+1])); for i in range(len(s)-1, 0, -1): print(strdiv(s[i], s[i-1])); #找一个字符串中所有待查找子串的位置,返回位置阵列 def findall(string, sub): size = len(string); index = []; cur = string.find(sub); index.append(cur) while (index[-1] != -1): cur = string.find(sub, index[-1]+1); index.append(cur); return index; if __name__ == '__main__': #tmp1(); s = 'abcdefgabcdefgabcdefg'; print(findall(s, 'c')); #计算单项式的乘方, s^n def strpow(s, n): stmp = strmono(s); signIndex = stmp.find('*'); coef = stmp[:signIndex]+'**'+str(n); expr = '('+stmp[signIndex+1:]+')^['+str(n)+']'; return '('+str(round(eval(coef), 6))+')*'+expr; if __name__ == '__main__': #tmp1(); s = ['-3', '3', 'x', '-x', '2x', '-2x', '-2x^[2]', '3x_[2]^[3]', '-3x_[2]^[3]']; for i in range(len(s)): print(strpow(s[i], 3)); #计算代数式用,传入的两个阵列都具有['s1', 's2', ..., 'sn']这样的格式 def strdot(array1, array2): size1 = len(array1); size2 = len(array2); result = []; for i in range(size1): for j in range(size2): result.append(strmul(array1[i], array2[j])); return result; if __name__ == '__main__': #tmp1(); s = ['-3', '3', 'x', '-x', '2x', '-2x', '-2x^[2]', '3x_[2]^[3]', '-3x_[2]^[3]']; s1 = ['3x']; answer = strdot(s, s1); print(answer); >>> ['(-3)', ''] ['(3)', ''] ['(1)', 'x'] ['(-1)', 'x'] ['(2)', 'x'] ['(-2)', 'x'] ['(-2)', 'x^[2]'] ['(3)', 'x_[2]^[3]'] ['(-3)', 'x_[2]^[3]'] #把格式化后的单项式分解成[coef, expr]对组的形式 def explodemono(mono): stmp = mono; #乘号的位置 signIndex = stmp.find('*'); if (signIndex == -1): coef = stmp; expr = ''; else: coef = stmp[:signIndex]; expr = stmp[signIndex+1:]; return [coef, expr]; if __name__ == '__main__': #tmp1(); s = ['-3', '3', 'x', '-x', '2x', '-2x', '-2x^[2]', '3x_[2]^[3]', '-3x_[2]^[3]']; for i in range(len(s)): print(explodemono(strmono(s[i]))); >>> [['(-3)+(3)', ''], ['(1)+(-1)+(2)+(-2)', 'x'], ['(-2)', 'x^[2]'], ['(3)+(-3)', 'x_[2]^[3]']] #合并同类项,传入的阵列具有['s1', 's2', ..., 'sn']这样的格式 def strcombine(array): size = len(array); explode = []; for i in range(size): #这里传入的阵列已经是规格化后的了,否则要加一层strmono处理。 explode.append(explodemono(array[i])); result = []; for i in range(size): size_1 = len(result); if size_1 <= 0: result.append(explode[i]); else: for j in range(size_1): if result[j][1] == explode[i][1]: result[j][0] = result[j][0] + '+' + explode[i][0]; break; if j >= size_1-1: result.append(explode[i]); return result; if __name__ == '__main__': #tmp1(); s = ['-3', '3', 'x', '-x', '2x', '-2x', '-2x^[2]', '3x_[2]^[3]', '-3x_[2]^[3]']; result = []; for i in range(len(s)): result.append(strmono(s[i])); answer = strcombine(result); print(answer); >>> [['0', ''], ['0', 'x'], ['-2', 'x^[2]'], ['0', 'x_[2]^[3]']] size_1 = len(result); for j in range(size_1): result[j][0] = str(round(eval(result[j][0]), 6)); >>> ['(0)', '(0)*x', '(-2)*x^[2]', '(0)*x_[2]^[3]'] >>> ['(0)', '(0)', '(-2)*x^[2]', '(0)'] #合并同类项,传入的阵列具有['s1', 's2', ..., 'sn']这样的格式 def strcombine(array): size = len(array); explode = []; for i in range(size): #这里传入的阵列已经是规格化后的了,否则要加一层strmono处理。 explode.append(explodemono(array[i])); result = []; for i in range(size): size_1 = len(result); if size_1 <= 0: result.append(explode[i]); else: for j in range(size_1): if result[j][1] == explode[i][1]: result[j][0] = result[j][0] + '+' + explode[i][0]; break; if j >= size_1-1: result.append(explode[i]); result_1 = []; size_1 = len(result); for j in range(size_1): result[j][0] = str(round(eval(result[j][0]), 6)); if (result[j][0] == '0'): result_1.append('(0)'); else: tmps = result[j][1]; if (tmps == ''): result_1.append('('+result[j][0]+')'); else: result_1.append('('+result[j][0]+')*'+result[j][1]); return result_1; >>> ['(1)*x', '(-1)*y'] ['(1)*x*x', '(-1)*x*y', '(-1)*y*x', '(1)*y*y'] ['(1)*x*x*x', '(-1)*x*x*y', '(-1)*x*y*x', '(1)*x*y*y', '(-1)*y*x*x', '(1)*y*x*y', '(1)*y*y*x', '(-1)*y*y*y'] [] #指数为正整数的乘方 def strpow_n(array, n): result = []; if (n == 1): result = array; elif (n == 2): result = strdot(array, array); elif (n == 3): tmp = strdot(array, array); result = strdot(tmp, array); return result; if __name__ == '__main__': #tmp1(); s = ['x', '-y']; array = []; for i in range(len(s)): array.append(strmono(s[i])); s = array; print(s); result = []; print(strpow_n(s, 2)); print(strpow_n(s, 3)); print(strpow_n(s, 4)); #指数为正整数的乘方 def strpow_n(array, n): #进行格式化处理 s = []; for i in range(len(array)): s.append(strmono(array[i])); array = s; #计算 result = []; if (n == 1): result = array; elif (n == 2): result = strdot(array, array); elif (n == 3): tmp = strdot(array, array); result = strdot(tmp, array); return result; >>> ['(3)', '(-3)', '(-1)*x', '(1)*x', '(-2)*x', '(2)*x', '(2)*x^[2]', '(-3)*x_[2]^[3]', '(3)*x_[2]^[3]'] #阵列取负 def minus(array): for i in range(len(array)): if array[i][1] == '-': #array[i][0]是'(, 这是规范 array[i] = array[i][0]+array[i][2:]; else: array[i] = array[i][0]+'-'+array[i][1:]; return array; if __name__ == '__main__': #tmp2(); s = ['-3', '3', 'x', '-x', '2x', '-2x', '-2x^[2]', '3x_[2]^[3]', '-3x_[2]^[3]']; for i in range(len(s)): s[i] = strmono(s[i]); result = minus(s); print(result); </span>
几何运算:
<span style="font-size:18px;">#两点之间 #平面两点的距离[x1, y1] -- [x2, y2] def distance2D(Point_1, Point_2): x1, y1, x2, y2 = Point_1[0], Point_1[1], Point_2[0], Point_2[1]; return ((x2-x1)**2+(y2-y1)**2)**0.5; #平面直线的斜率[x1, y1] -- [x2, y2] def slope(Point_1, Point_2): x1, y1, x2, y2 = Point_1[0], Point_1[1], Point_2[0], Point_2[1]; if (x1 == x2): return 'inf'; else: return (y2-y1)/(x2-x1); #平面直线与X轴的夹角[x1, y1] -- [x2, y2] def angleFromX(Point_1, Point_2): x1, y1, x2, y2 = Point_1[0], Point_1[1], Point_2[0], Point_2[1]; delta = ((x2-x1)**2+(y2-y1)**2)**0.5; dx = x2 - x1; dy = y2 - y1; sin = math.asin(dy / delta)/math.pi*180; cos = math.acos(dx / delta)/math.pi*180; if (dy >= 0 and dx >= 0): return math.asin(dy / delta)/math.pi*180; elif (dy >= 0 and dx < 0): return 180- math.asin(dy / delta)/math.pi*180; elif (dy < 0 and dx <= 0): return 180 - math.asin(dy / delta)/math.pi*180; else: return 360 + math.asin(dy / delta)/math.pi*180; #平面直线的截距[x1, y1] -- [x2, y2] def interceptOfLine(Point_1, Point_2): k = slope(Point_1, Point_2); if k == 'inf': return [k, Point_1[0], 1e8]; elif k == 0: return [k, 1e8, Point_1[1]]; else: return [k, Point_1[0]-Point_1[1]/k, Point_1[1]-Point_1[0]*k]; #求直线的中垂线 def perpendicular(Line): Point_1, Point_2= Line[0], Line[1]; #求斜率 k = slope(Line[0], Line[1]); if k == 'inf': k1 = 0; else: k1 = -1/k; midPoint = [0.5*(Point_1[0]+Point_2[0]), 0.5*(Point_1[1]+Point_2[1])]; return [midPoint, [midPoint[0]+ 10, midPoint[0]+10*k1]]; #两直线之间 #两直线是否平行 Line_1:[Point_1, Point_2], Line_2:[Point_1, Point_2] def parallelCheck(Line_1, Line_2): L1_Point_1, L1_Point_2, L2_Point_1, L2_Point_2 = Line_1[0], Line_1[1], Line_2[0], Line_2[1]; k1, k2 = slope(L1_Point_1, L1_Point_2), slope(L2_Point_1, L2_Point_2); if k1 == k2 == 'inf': return True; elif k1 != 'inf' and k2 != 'inf' and abs(k1 - k2) < 1e-6: return True; return False; #两直线距离 Line_1:[Point_1, Point_2], Line_2:[Point_1, Point_2] def lineDistance2D(Line_1, Line_2): if parallelCheck(Line_1, Line_2): L1_Point_1, L1_Point_2, L2_Point_1, L2_Point_2 = Line_1[0], Line_1[1], Line_2[0], Line_2[1]; k1, k2 = slope(L1_Point_1, L1_Point_2), slope(L2_Point_1, L2_Point_2); if k1 == 'inf': return abs(L1_Point_1[0] - L2_Point_1[0]); else: dx = L1_Point_1[0] - L2_Point_1[0]; dy = k1*dx; return abs((L2_Point_1[1]+dy-L1_Point_1[1])/(1+k1**2)**0.5); else: return 0; #两直线夹角 Line_1:[Point_1, Point_2], Line_2:[Point_1, Point_2] def angleBetweenTwoLine(Line_1, Line_2): L1_Point_1, L1_Point_2, L2_Point_1, L2_Point_2 = Line_1[0], Line_1[1], Line_2[0], Line_2[1]; return angleFromX(L2_Point_1, L2_Point_2) - angleFromX(L1_Point_1, L1_Point_2); #两直线交点 Line_1:[Point_1, Point_2], Line_2:[Point_1, Point_2] def crossPointOfTwoLine(Line_1, Line_2): if not parallelCheck(Line_1, Line_2): L1_Point_1, L1_Point_2, L2_Point_1, L2_Point_2 = Line_1[0], Line_1[1], Line_2[0], Line_2[1]; ''' k1, k2 = slope(L1_Point_1, L1_Point_2), slope(L2_Point_1, L2_Point_2); if (k1 == 'inf'): return [L1_Point_1[0], L2_Point_1[1]-k2*(L2_Point_1[0]-L1_Point1[0])]; elif (K2 == 'inf'): return [L2_Point_1[0], L1_Point_1[1]-k1*(L1_Point_1[0]-L2_Point1[0])]; ''' x0, y0, x1, y1, x2, y2, x3, y3 = L1_Point_1[0], L1_Point_1[1], L1_Point_2[0], L1_Point_2[1], L2_Point_1[0], L2_Point_1[1], L2_Point_2[0], L2_Point_2[1]; crossY = ( (y0-y1)*(y3-y2)*x0 + (y3-y2)*(x1-x0)*y0 + (y1-y0)*(y3-y2)*x2 + (x2-x3)*(y1-y0)*y2 ) / ( (x1-x0)*(y3-y2) + (y0-y1)*(x3-x2) ); crossX = x2 + (x3-x2)*(crossY-y2) / (y3-y2); return [crossX, crossY]; #判定三点共线 def pointInLine(Point_1, Point_2, Point_3): x0, y0, x1, y1, x2, y2 = Point_1[0], Point_1[1], Point_2[0], Point_2[1], Point_3[0], Point_3[1]; return (x0*y1-y0*x1)+(x1*y2-y1*x2)+(x2*y0-y2*x0) == 0; #点到直线的距离 def plDistance2D(Point, Line): LPoint_1, LPoint_2 = Line[0], Line[1]; if (pointInLine(Point, LPoint_1, LPoint_2)): return 0; else: k = slope(LPoint_1, LPoint_2); if k == 'inf': return abs(Point[0]-LPoint_1[0]); else: Point2 = [Point[0] + 10, Point[1] + 10 * k]; return lineDistance2D([Point, Point2], Line); #圆 三点成圆 #以确定的三点表示圆的方程,得到圆心和半径 [x1, y1] -- [x2, y2] -- [x3, y3] def circle(Point_1, Point_2, Point_3): if not pointInLine(Point_1, Point_2, Point_3): x1, y1, x2, y2, x3, y3 = Point_1[0], Point_1[1], Point_2[0], Point_2[1], Point_3[0], Point_3[1]; A1 = 2*(x2-x1); B1 = 2*(y2-y1); C1 = x2*x2+y2*y2-x1*x1-y1*y1; A2 = 2*(x3-x2); B2 = 2*(y3-y2); C2 = x3*x3+y3*y3-x2*x2-y2*y2; #圆心 px = ((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1)); py = ((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1)); a = round(distance2D(Point_1, Point_2), 3); b = round(distance2D(Point_2, Point_3), 3); c = round(distance2D(Point_3, Point_1), 3); #半径 R = a*b*c/(4*b*b*c*c-(b*b+c*c-a*a)**2)**0.5; return [[px, py], R]; else: return [[0, 0], 0]; #判断点和圆的距离 Point:[x, y], Circle: [[x1, y1], [x2, y2], [x3, y3]] def pointFromCircle(Point, Circle): cPoint_1, cPoint_2, cPoint_3 = Circle[0], Circle[1], Circle[2]; circleCenter, R = circle(cPoint_1, cPoint_2, cPoint_3); d = distance2D(Point, circleCenter); #点与圆的位置关系,分为在内部,在外部和在圆上。 if (d < R): return 'IN'; elif (d > R): return 'OUT'; else: return 'ON'; #过圆外部一点,得到与圆的切点的坐标 Point:[x, y], Circle: [[x1, y1], [x2, y2], [x3, y3]] def tangencyPoint(Point, Circle): if pointFromCircle(Point, Circle) == 'OUT': cPoint_1, cPoint_2, cPoint_3 = Circle[0], Circle[1], Circle[2]; circleCenter, R = circle(cPoint_1, cPoint_2, cPoint_3); x1, y1, x2, y2 = circleCenter[0], circleCenter[1], Point[0], Point[1]; dsquare = (x2-x1)**2+(y2-y1)**2; part_1 = (R*R*(y1-y2)**2*(dsquare-R*R))**0.5; part_2 = (y1-y2)*dsquare; #第一个切点 x3 = (-part_1+R*R*(x2-x1)+x1*dsquare)/dsquare; y3 = ((x1-x2)*part_1-R*R*(y1-y2)**2+y1*part_2)/part_2; #第二个切点 x4 = (part_1+R*R*(x2-x1)+x1*dsquare)/dsquare; y4 = (-(x1-x2)*part_1-R*R*(y1-y2)**2+y1*part_2)/part_2; return [[x3, y3], [x4,y4]]; return [[0,0], [0,0]]; #直线到圆的距离 def lcDistance2D(Line, Circle): lPoint_1, lPoint_2 = Line[0], Line[1]; cPoint_1, cPoint_2, cPoint_3 = Circle[0], Circle[1], Circle[2]; circleCenter, R = circle(cPoint_1, cPoint_2, cPoint_3); #圆心到直线的距离 d = plDistance2D(circleCenter, Line); return d-R; #直经与圆的交点 def lcCrossPoint2D(Line, Circle): #直线与圆相交 if lcDistance2D(Line, Circle) <= 0: lPoint_1, lPoint_2 = Line[0], Line[1]; cPoint_1, cPoint_2, cPoint_3 = Circle[0], Circle[1], Circle[2]; circleCenter, R = circle(cPoint_1, cPoint_2, cPoint_3); k, a, b = interceptOfLine(lPoint_1, lPoint_2); if k == 'inf': k = 1e8; c, d = -circleCenter[0], -circleCenter[1]; print(k, a, b, c, d, R); part_0 = (k*k+1)*R*R-c*c*k*k; part_1 = (2*c*d+ 2*b*c)*k- d*d-2*b*d-b*b; part_2 = (d+b)*k+c; part_3 = d*k*k-b; part_4 = (k*k+1); x1 = -((part_0 + part_1)**0.5+part_2)/part_4; y1 = -(k*((part_0+part_1)**0.5 + c)+part_3)/part_4; x2 = ((part_0+part_1)**0.5-part_2)/part_4; y2 = (k*((part_0+part_1)**0.5 - c)-part_3)/part_4; return [[x1, y1], [x2, y2]]; return [[1e8, 1e8], [1e8, 1e8]]; </span>
本节到此结束,欲知后事如何,请看下回分解。
时间: 2024-10-01 06:21:24