[从头学数学] 第193节 推理与证明

剧情提要:

[机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第五转的修炼。

这次要研究的是[推理与证明]。

正剧开始:

星历2016年04月24日 12:16:07, 银河系厄尔斯星球中华帝国江南行省。

[工程师阿伟]正在和[机器小伟]一起研究[推理与证明]。

<span style="font-size:18px;">>>>
23.5 13.865424623862042

#海伦-秦九韶公式
def HQFormula(a, b, c):
    p = (a+b+c)/2;
    S = math.sqrt(p*(p-a)*(p-b)*(p-c));  

    return S;

#例3
def tmp():
    #a, b, c = 3, 4, 5
    a, b, c = 3, 4, 5
    S1= a*b/2
    S2 = a*c/2
    S3 = b*c/2
    S4 = HQFormula((a*a+b*b)**0.5, (a*a+c*c)**0.5, (b*b+c*c)**0.5);
    print(S1+S2+S3, S4);</span>

<span style="font-size:18px;">	if (1) {
		var array = new Array();

		array[0] = [1];
		array[1] = [1,1];

		for (var i = 2; i < 10; i++) {
			array[i] = [1];
			for (var j = 1; j < i; j++) {
				array[i].push(array[i-1][j-1]+array[i-1][j]);
			}
			array[i].push(1);
		}

		var width = 600, height = 400;
		var x = width/2, y = 30;
		var measure = 0, s = '';
		var len = array.length;

		for (var i = 0; i < len; i++) {
			s = array[i].join('    ');
			measure = plot.measureText(s);

			plot.fillText(s, x-measure/2, y, measure);
			y += 30;

		}
	}</span>

关于求二面角,小伟找到了这个公式:

<span style="font-size:18px;">>>>
cos =  0.9218142082600806 角度是: 22.80723538641745 度

#[数] dihedral angle;
#二面角余弦
def dihedral():
    xyz = [-1.2999760,0.0173840,-0.7162670,           1.0107690,1.5229620,-0.0945670,           0.0932470,-1.0086090,1.6265070,           -1.2280340,-1.4934410,1.8123150,           0.0932470,-1.0086090,1.6265070,           1.0734260,-1.5230970,2.5155820]

    #六个点
    ax1 = xyz[0]
    ay1 = xyz[1]
    az1 = xyz[2]
    bx2 = xyz[3]
    by2 = xyz[4]
    bz2 = xyz[5]
    cx3 = xyz[6]
    cy3 = xyz[7]
    cz3 = xyz[8]
    dx1 = xyz[9]
    dy1 = xyz[10]
    dz1 = xyz[11]
    ex2 = xyz[12]
    ey2 = xyz[13]
    ez2 = xyz[14]
    fx3 = xyz[15]
    fy3 = xyz[16]
    fz3 = xyz[17]

    #面一法线
    nx = ((cz3-az1)/(cy3-ay1)-(bz2-az1)/(by2-ay1))/((bx2-ax1)/(by2-ay1)-(cx3-ax1)/(cy3-ay1))
    ny = ((cz3-az1)/(cx3-ax1)-(bz2-az1)/(bx2-ax1))/((by2-ay1)/(bx2-ax1)-(cy3-ay1)/(cx3-ax1))
    nz = 1

    #面二法线
    mx = ((fz3-dz1)/(fy3-dy1)-(ez2-dz1)/(ey2-dy1))/((ex2-dx1)/(ey2-dy1)-(fx3-dx1)/(fy3-dy1))
    my = ((fz3-dz1)/(fx3-dx1)-(ez2-dz1)/(ex2-dx1))/((ey2-dy1)/(ex2-dx1)-(fy3-dy1)/(fx3-dx1))
    mz = 1

    cosAngle = (nx*mx+ny*my+nz*mz)/((math.sqrt(nx**2+ny**2+nz**2))*(math.sqrt(mx**2+my**2+mz**2)));

    print('cos = ', cosAngle, '角度是:', 180/math.pi*math.acos(cosAngle), '度');
	</span>

但是在验证的过程中小伟发现这个算法好像有问题:

比如对于下面这个例子:

求一下VAB和ABC的二面角

<span style="font-size:18px;">>>> 

[2, 5, 2, 5, 0, 1, 0, 0, 0, 1, 1, 5, 5, 0, 1, 0, 0, 0]
cos =  0.4911436350228293 角度是: 60.584222864016645 度

#[数] dihedral angle;
#二面角余弦
#暂时只能算不垂直或平行于xy, xz, yz任一平面的两平面的二面角
#公式寻找中...
def dihedral(points):
    #points格式是 []*18, 分六个点,每个点x, y, z坐标排列
    '''
    xyz = [-1.2999760,0.0173840,-0.7162670,           1.0107690,1.5229620,-0.0945670,           0.0932470,-1.0086090,1.6265070,           -1.2280340,-1.4934410,1.8123150,           0.0932470,-1.0086090,1.6265070,           1.0734260,-1.5230970,2.5155820]
    '''

    if (len(points) != 18):
        return 'inf';

    xyz = points;

    #六个点
    ax1 = xyz[0]
    ay1 = xyz[1]
    az1 = xyz[2]
    bx2 = xyz[3]
    by2 = xyz[4]
    bz2 = xyz[5]
    cx3 = xyz[6]
    cy3 = xyz[7]
    cz3 = xyz[8]
    dx1 = xyz[9]
    dy1 = xyz[10]
    dz1 = xyz[11]
    ex2 = xyz[12]
    ey2 = xyz[13]
    ez2 = xyz[14]
    fx3 = xyz[15]
    fy3 = xyz[16]
    fz3 = xyz[17]

    #面一法线
    nx = ((cz3-az1)/(cy3-ay1)-(bz2-az1)/(by2-ay1))/((bx2-ax1)/(by2-ay1)-(cx3-ax1)/(cy3-ay1))
    ny = ((cz3-az1)/(cx3-ax1)-(bz2-az1)/(bx2-ax1))/((by2-ay1)/(bx2-ax1)-(cy3-ay1)/(cx3-ax1))
    nz = 1

    #面二法线
    mx = ((fz3-dz1)/(fy3-dy1)-(ez2-dz1)/(ey2-dy1))/((ex2-dx1)/(ey2-dy1)-(fx3-dx1)/(fy3-dy1))
    my = ((fz3-dz1)/(fx3-dx1)-(ez2-dz1)/(ex2-dx1))/((ey2-dy1)/(ex2-dx1)-(fy3-dy1)/(fx3-dx1))
    mz = 1

    cosAngle = (nx*mx+ny*my+nz*mz)/((math.sqrt(nx**2+ny**2+nz**2))*(math.sqrt(mx**2+my**2+mz**2)));

    print('cos = ', cosAngle, '角度是:', 180/math.pi*math.acos(cosAngle), '度');

#求二面角
def tmp():
    V = [2, 5, 2]
    A = [5, 0, 1]
    B = [0, 0, 0]
    C = [1, 1, 5]

    points = V+ A + B+ C+A+B;

    #print(len(points));
    print(points);

    dihedral(points);</span>

再求一下VBC与ABC的,或是VAB与VBC的

<span style="font-size:18px;">>>>
[2, 5, 2, 0, 0, 0, 1, 1, 5, 1, 1, 5, 5, 0, 1, 0, 0, 0]
cos =  -0.2558139534883721 角度是: 104.82182106205012 度
>>> ================================ RESTART ================================
>>>
[2, 5, 2, 5, 0, 1, 1, 1, 5, 1, 1, 5, 5, 0, 1, 0, 0, 0]
cos =  -0.19218663979154185 角度是: 101.08042157684446 度</span>

怎么都会是100多度呢,看着不像啊,但小伟也说不准是对是错。

先放着吧。

<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,190);              

        //坐标轴设定
        var scaleX = 4*r, scaleY = 4*r;
        var spaceX = 2, spaceY = 2;
        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 array = [[2, 5, 2], [5, 0, 1], [0, 0, 0], [1, 1, 5]];

        //array = shape.xyzSort(array);
        var size = array.length;    

        var array2D = [];
        for (var i = 0; i < size; i++) {
            array2D.push(shape.point3D(array[i][0], array[i][1], array[i][2]));
        }  

        //去除重复点
        var pointArray = removeDuplicatedPoint(array2D);
        //无重复的点的数量
        var points = pointArray.length;    

        //得到距离阵列
        //格式为[[点1序号,点2序号, 距离值], ...]
        var distanceArray = distanceSort(pointArray);
        //边的数量
        var edges = distanceArray.length;    

        //存放需要连通的边
        var linkedArray = [];
        //连通的边的数量
        var links = 0;    

        //每个顶点相关的边的集合
        var edgeOfVertex = [];    

        for (var i = 0; i < points; i++) {    

            //获得顶点相关的边的集合
            edgeOfVertex = [];
            for (var j = 0; j < edges; j++) {
                if (distanceArray[j][0] == i ||
                    distanceArray[j][1] == i) {
                    edgeOfVertex.push(distanceArray[j]);
                }
            }    

            //根据起始点寻找最短长度的两条边
            edgeOfVertex.sort(function(a, b) {
                return a[2] - b[2];
            });    

            var choice = 4;
            if (edgeOfVertex.length > choice) {
                edgeOfVertex = edgeOfVertex.slice(0, choice);
            }    

            linkedArray = linkedArray.concat(edgeOfVertex);
        }    

        //document.write(linkedArray.join(' , ')+'<br/>');
        linkedArray = removeDuplicatedPoint(linkedArray);
        links = linkedArray.length;    

        //document.write(linkedArray.join(' , ')+'<br/>');        

        var startPoint, endPoint, x1, y1, x2, y2;
        //比例缩放
        var scale = 40;    

        for (var i = 0; i < links; i++) {
            startPoint = linkedArray[i][0];
            endPoint = linkedArray[i][1];
            x1 = pointArray[startPoint][0];
            y1 = pointArray[startPoint][1];
            x2 = pointArray[endPoint][0];
            y2 = pointArray[endPoint][1];    

            shape.vectorDraw([[x1,y1], [x2, y2]], 'red', scale);
        }    

        shape.pointDraw(pointArray, 'blue', scale, 1, 'VABC');  

        plot.setFillStyle('blue');
        plot.fillText('向量图', -270, -170, 300);    

    }</span>

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

时间: 2024-10-22 06:22:02

[从头学数学] 第193节 推理与证明的相关文章

[从头学数学] 第174节 算法初步

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了结丹中期的修炼, 这次要修炼的目标是[算法初步]. 正剧开始: 星历2016年04月12日 08:54:58, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[算法初步]. [人叫板老师]指点小伟说:"这金丹要想大成,顺利进入元婴期,就必须进行九转培炼. 这什么是九转培炼法门呢?就是要先快速的修炼[天地人正册]进入后期,不要管各种辅修 功法,然后从头游历[天地人列国],在游历中增长见闻,精炼神通,最后再修炼[术.

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

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月26日 10:23:46, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2014年的江苏省数学高考题]. 这一年的题和上一年一样的难,阿伟决定再交一次白卷. 好,卷子贴完,下面进入这次的主题. 这是

[从头学数学] 第215节 带着计算机去高考(七)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月20日 17:13:35, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2006年的江苏省数学高考题]. 这一年,江苏重新使用了全国卷,并且这张试卷的难度也比较高,可以说, 也是打了考生一个措手不及

[从头学数学] 第192节 导数及其应用

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第五转的修炼. 这次要研究的是[导数及其应用]. 正剧开始: 星历2016年04月23日 16:32:36, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[导数及其应用]. <span style="font-size:18px;">>>> [-3.000001001396413, -2.999998999442255] [4.999998999721811

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

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月20日 11:40:58, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2005年的江苏省数学高考题]. 总体来说,这次的难度和上一年持平,都是很厚道的那种, 不过上一年的好多题都像闹着玩似的,这次

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

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月24日 17:11:11, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2011年的江苏省数学高考题]. 2011年的卷子,难度比上一年的稍小一点,但阿伟觉得也达到了5.5环的难度. 这次的特色,是

[从头学数学] 第179节 三角初等变换

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了结丹中期的修炼, 这次要修炼的目标是[三角初等变换]. 正剧开始: 星历2016年04月15日 15:32:35, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[三角初等变换]. <span style="font-size:18px;"> if (1) { var mathText = new MathText(); var s = [ '和角.差角公式', 'sin(A+B) = si

[从头学数学] 第216节 带着计算机去高考(八)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月21日 11:31:19, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2007年的江苏省数学高考题]. 这一年的卷子又回到了比较低的难度,感觉这就是正弦曲线的节奏. <span style="

[从头学数学] 第162节 锐角三角函数

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了筑基后期的修炼, 这次要修炼的目标是[锐角三角函数]. 正剧开始: 星历2016年04月05日 10:20:54, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[锐角三角函数]. 这座塔真的很壮观,不知现在还是否允许游客上去观光. <span style="font-size:18px;"> if (1) { config.setSector(1,1,1,1); var r = 20; c