2014年全国数学建模B题程序

来源:互联网 发布:淘宝衣服洗了还能退吗 编辑:程序博客网 时间:2024/04/29 07:50

matlab亲测通过!

今年参加了数学建模,感觉挺高大上的,虽然我是数学专业的,但我这次主要负责编程,下面就给出我的matlab程序和部分图(桌面在下)和同志们分享。亲测通过!

function [x0,y0,z0]=DeskPoint_0(n,r)
%求桌面上各链接点坐标
%r为桌面圆的半径
%d为桌腿的宽度
%n为桌腿数目即桌腿与桌面链接点数目
x0=zeros(1,n);
y0=zeros(1,n);
z0=zeros(1,n);
sita=pi/20;
for i=1:n+1
    if i<11&&i>=1  %1=<i<11
        x0(i)=-r*sin((i-1)*sita);
        y0(i)=-r*cos((i-1)*sita);
        z0(i)=0;
    elseif i>=11&&i<21   %11=<i<21
        x0(i)=-r*cos((i-11)*sita);
        y0(i)=r*sin((i-11)*sita);
        z0(i)=0;
    elseif i>=21&&i<31  %21=<i<31.
        x0(i)=r*sin((i-21)*sita);
        y0(i)=r*cos((i-21)*sita);
        z0(i)=0;
    elseif i>=31&&i<=41  %31=<i<=40
        x0(i)=r*cos((i-31)*sita);
        y0(i)=-r*sin((i-31)*sita);
        z0(i)=0;
    end
end
end

 

function long=Diameter2Edge(x0,y0,z0,r,n)
%计算直径到圆周上各链接点的距离
%x0,y0,z0分别为圆周上各链接点的x,y,z坐标
%r为桌面圆周的半径
%n为圆周上链接点的个数
long=zeros(1,n);
for i=1:n
    long(i)=sqrt(x0(i)^2+z0(i)^2);
end
end

 

 

function [x1,y1,z1]=SolvePoint1(n,s,sita,yi)
%求钢筋上各连结点的坐标
%n为钢筋上链接点的个数
%s为最外面一条桌腿钢筋连接处与桌腿和桌面链接处接点的距离
%sita为最外面一条桌腿与桌面间的夹角
%yi为桌面上各链接点的y坐标
x1=zeros(1,n);
y1=zeros(1,n);
z1=zeros(1,n);
for i=1:n
    if i<=n/2
        x1(i)=-s*cos(pi-sita);
        y1(i)=yi(i);
        z1(i)=s*sin(pi-sita);
    else
        x1(i)=s*cos(pi-sita);
        y1(i)=yi(i);
        z1(i)=s*sin(pi-sita);
    end
end
plot3(x1(1:n/2),y1(1:n/2),z1(1:n/2));
hold on;
plot3(x1((n/2+1):n),y1((n/2+1):n),z1((n/2+1):n));
hold on;
end

 

function edgeposition=DeskPaint(r,n,sita,s,ss)
%求各桌腿所在直线的参数方程并绘制出三维图形
%x0,y0,z0分别为各桌腿与桌面链接点的x,y,z坐标
%x1,y1,z1分别为各桌腿与钢筋联结点的x,y,z坐标
%n为桌腿的个数
%edgeposition为桌腿边缘曲线三维坐标矩阵
[x0,y0,z0]=SolvePoint0(n,r)
[x1,y1,z1]=SolvePoint1(n,s,sita,y0);
long=Diameter2Edge(x0,y0,z0,r,n);
x=zeros(n,100);
y=zeros(n,100);
z=zeros(n,100);
edgeposition=zeros(3,20);
for i=1:n
    w=1;
    j=0;
    x(i,w)=j.*(x1(i)-x0(i))+x0(i);
    y(i,w)=j.*(y1(i)-y0(i))+y0(i);
    z(i,w)=j.*(z1(i)-z0(i))+z0(i);
    between=sqrt((x(i,w)-x0(i))^2+(y(i,w)-y0(i))^2+(z(i,w)-z0(i))^2)+long(i);
    while between<ss
        x(i,w)=j.*(x1(i)-x0(i))+x0(i);
        y(i,w)=j.*(y1(i)-y0(i))+y0(i);
        z(i,w)=j.*(z1(i)-z0(i))+z0(i);
        w=w+1;
        j=j+0.1;
        between=sqrt((x(i,w-1)-x0(i))^2+(y(i,w-1)-y0(i))^2+(z(i,w-1)-z0(i))^2)+long(i);
    end
    if i<=n/2
        edgeposition(1,i)=x(i,w-1);
        edgeposition(2,i)=y(i,w-1);
        edgeposition(3,i)=z(i,w-1);
    end
    xx=x(i,:);
    yy=y(i,:);
    zz=z(i,:);
    xx(w:100)=[];
    yy(w:100)=[];
    zz(w:100)=[];
    plot3(xx,yy,zz);
    hold on;
end
plot3(x0,y0,z0);
hold on;
title('折叠桌面动态三维图');
xlabel('x');
ylabel('y');
zlabel('z');
grid on;
end

运行图如下:

                               夹角为180度图                                                                                         夹角为120度图

0 0