2014年全國數學建模B題程序

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度圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章