打字猴:1.70100965e+09
1701009650
1701009651
1701009652
1701009653 图8-7 等高线和曲面的负梯度图
1701009654
1701009655 从图8-7中可清晰的知道,每一个起点位置到山顶峰点之间的最快梯度路径,同样,对于该函数很容易求出一条最优路径,选取起点为(0.9,1.2,-9.63),终点为(0,0,0),编程如下:
1701009656
1701009657     clc,clear,close all                           %清屏和清除变量    warning off                                   %消除警告    %盲人下山    [X1,Y1]= meshgrid(-2:0.1:4,-2:0.1:4);         %数据平面栅格化    x1 = X1; x2 = Y1;    Z1 = 8*x1.^2+9*x2.^2-8.*x1.*x2-12*x1-6*x2;    %函数    figure(‘color’,[1,1,1])                       %设置图形背景为白色    mesh(X1,Y1,Z1)                                %3D曲面绘制    %%NxM 矩阵化为一行    nX1 = size(X1);    kk=1;    for i=1:nX1(1,1)        for j=1:nX1(1,2)            X2(1,kk) = X1(i,j);                   %将矩阵化成一列            Y2(1,kk) = Y1(i,j);            Z2(1,kk) = Z1(i,j);            kk=kk+1;        end    end    %%距离    for i=1:length(X2)        for j=1:length(X2)            Distance(i,j)=sqrt( (X2(i)-X2(j))^2 + (Y2(i)-Y2(j))^2 + (Z2(i)-            Z2(j))^2 );            Distance(j,i)=Distance(i,j);        end    end    %%邻接矩阵    A=zeros(length(X2),length(X2));               %构建邻接矩阵    %第一行数据    for i = 1:nX1(1,2)-1        A(i,i+1)=1;        A(i,nX1(1,2)+i)=1;        A(i,nX1(1,2)+i+1)=1;     end    for i=2:nX1(1,1)-1                             %第二行到倒数第二行        for j=2:nX1(1,2)-1                         %倒数第二列            A( (i-1)*nX1(1,2)+j, (i-2)*nX1(1,2)+j ) = 1;                                                          %该点正上方点            A( (i-1)*nX1(1,2)+j, (i-2)*nX1(1,2)+j-1 ) = 1;                                                          %该点正上方点,向左移一位            A( (i-1)*nX1(1,2)+j, (i-2)*nX1(1,2)+j+1 ) = 1;                                                          %该点正上方点,向右移一位            A( (i-1)*nX1(1,2)+j, (i-1)*nX1(1,2)+j-1 ) = 1;                                                          %该点行上,向左移一位            A( (i-1)*nX1(1,2)+j, (i-1)*nX1(1,2)+j+1 ) = 1;                                                          %该点行上,向右移一位            A( (i-1)*nX1(1,2)+j, (i)*nX1(1,2)+j ) = 1;                                                          %该点正下方点            A( (i-1)*nX1(1,2)+j, (i)*nX1(1,2)+j-1 ) = 1;                                                          %该点正下方点,向左移一位            A( (i-1)*nX1(1,2)+j, (i)*nX1(1,2)+j+1 ) = 1;                                                          %该点正下方点,向右移一位        end    end    for i=1:length(X2)        for j=1:length(X2)            A(j,i)=A(i,j);        end    end    %%求最短路径    %起点(0.9,1.2,-9.63),终点(0,0,0)    %画图    figure(‘color’,[1,1,1])    mesh(X1,Y1,Z1)    hold on    plot3(0.9,1.2,-9.63,‘r.’,‘Markersize’,40)    plot3(0,0,0,‘g.’,‘Markersize’,40)    hold off    %%    %起点在30行33列,终点在21行21列    D=Distance.*A;                                                      %相连节点计算距离    D(find(D==0))=99999;                                                %两点无边相连时赋值为inf    [Q_path, dmin] = dijkstra( 29*nX1(1,2)+33,20*nX1(1,2)+21 ,D);    disp([‘最短路径为:’, num2str(dmin)])    %%    figure(‘color’,[1,1,1])    mesh(X1,Y1,Z1)    xlabel(‘X’);ylabel(‘Y’);zlabel(‘Z’)    hold on    plot3(0.9,1.2,-9.63,‘b.’,‘Markersize’,40)    plot3(0,0,0,‘b.’,‘Markersize’,40)    for i=1:length(Q_path)        row = ( Q_path(i) - mod(Q_path(i), nX1(1,2)) )/nX1(1,2);        column = mod(Q_path(i),nX1(1,2));        X3(i) = X1(column,row);        Y3(i) = Y1(column,row);        Z3(i) = Z1(column,row);        plot3(X3(i),Y3(i),Z3(i),‘r.’,‘Markersize’,40,‘linewidth’,3);    end    %%    figure(‘color’,[1,1,1])    mesh(X1,Y1,Z1)    xlabel(‘X’);ylabel(‘Y’);zlabel(‘Z’)    hold on    plot3(0.9,1.2,-9.63,‘r.’,‘Markersize’,40)    plot3(0,0,0,‘g.’,‘Markersize’,40)        plot3(X3,Y3,Z3,‘b-‘,‘Markersize’,40,‘linewidth’,3);    set(gca,‘Xdir’,‘reverse’);    set(gca,‘Ydir’,‘reverse’);
1701009658
1701009659 运行程序输出结果如下:
1701009660
1701009661     最短路径为:9.8305
1701009662
1701009663 输出图形如图8-8所示。
1701009664
1701009665
1701009666
1701009667
1701009668 图8-8 函数下降梯度最快路径
1701009669
1701009670 对比图8-4和图8-8可知,图8-4在一头雾水的情况下,胡乱的随机走到下脚处x0,而采用计算机精确计算,其最优路线如图8-8所示,这个结果,完全是可以接受的。
1701009671
1701009672 计算机计算结果是能指导盲人下山的,大家可以根据该计算结果,不断地通过指南针定位经纬度,从而实现快速的下山。
1701009673
1701009674
1701009675
1701009676
1701009677 我和数学有约:趣味数学及算法解析 [:1701004257]
1701009678 我和数学有约:趣味数学及算法解析 8.3 Galton钉板实验
1701009679
1701009680 Galton钉板试验是英国生物统计学家Galton设计的,具体的工况如图8-9所示。
1701009681
1701009682
1701009683
1701009684
1701009685 图8-9 Galton钉板试验工况
1701009686
1701009687 为了较清晰地研究该问题,如图8-10示,在一板上钉有n=5排钉子,图8-10中15个圆点表示15颗钉子,在钉子的下方有n+1个格子,编号分别为0,1,2,…,n。从Galton钉板的上方扔进一个小球任其自由下落,在下落的过程中当小球碰到钉子时,从左边落下与从右边落下的机会相等。碰到下一排钉子时又是如此。最后落入底板中的某一个格子,图中用一条折线显示小球下落的一条轨迹。
1701009688
1701009689
1701009690
1701009691
1701009692 图8-10 模拟Galton钉板试验
1701009693
1701009694 【问题】向Galton钉板扔进一个小球,显然不能预测小球会落到哪一个格子,如果不断重复扔进过程,将会发生什么结果呢?
1701009695
1701009696 【分析】
1701009697
1701009698 (1)采用计算机模拟Galton钉板试验,具体实现过程如下。
1701009699
[ 上一页 ]  [ :1.70100965e+09 ]  [ 下一页 ]