24小时热门版块排行榜    

查看: 1392  |  回复: 7

碗碗儿2954

新虫 (小有名气)

[交流] 简单的MATLAB几何建模问题 已有2人参与

为了建立一系列随机分布的小球,编写程序如下,请懂的人帮忙看看,真是没辙了!   
    k=1;
    i=2:50;
    m=1:49;
    R(50)=ones;
    V(50)=ones;
    VSUM(50)=ones;
    [X,Y,Z]=sphere(50);
    R(1)=rand(1)/10;
    V(1)=(4/3)*pi*R(1)^3;
    originX=rand(1,50);
    originY=rand(1,50);
    originZ=rand(1,50);
    surf(X*R(1)+originX(1),Y*R(1)+originY(1),Z*R(1)+originZ(1));
    VSUM(1)=V(1);
for i=2:50
    R(i)=rand(1)/10;
    V(i)=(4/3)*pi*R(i)^3;
end
while (VSUM<v)
     for m=1:i-1
         A=R(i)+R(m);
         B=sqrt((originX(i)-originX(m))^2+(originY(i)-originY(m))^2+(originZ(i)-originZ(m))^2);
         if (A<B)
            k=k+1;
         end
         continue
     end
end
if (k==i)
      surf(X*R(i)+originX(i),Y*R(i)+originY(i),Z*R(i)+originZ(i));
      fprintf('The volume of the ith sphere is %12.5f\n',V(i));
      VSUM(i)=VSUM(i-1)+V(i);
      hold on
end
axis equal
回复此楼

» 猜你喜欢

努力!
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

碗碗儿2954

新虫 (小有名气)

每次输进去MATLAB就卡住了,难道是死循环了?
努力!
2楼2016-01-27 11:10:51
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

xiegangmai

版主 (职业作家)

我没头衔

优秀版主优秀版主优秀版主

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
碗碗儿2954: 金币+10 2016-01-28 09:35:50
简单写了下代码,楼主参考参考。
CODE:
function spheres

n = 100;
r = rand( 1, n ) / 10;

for i = 1 : n
    color_value = rand( 1, 3 ); % 颜色
    position = rand( 1, 3 );  % 球心坐标
     [ x, y, z ] = unitsphere;
     
     x =  r( i ) * x + position( 1 );
     y =  r( i ) * y + position( 2 );
     z =  r( i ) * z + position( 3 );
     
     h = surf( x, y, z);
     set( h, 'EdgeColor', 'none', ...
         'FaceColor', color_value  );
     hold on
end
axis equal

V = 4 * pi * r .^3 / 3;
VSUM = sum( V )

function [ x, y, z ] = unitsphere

r = 1; % 单位圆
n = 20;

theta = ( -n : 2 : n ) / n * pi;
phi = ( -n : 2 : n )' / n * pi / 2;

cosphi = cos( phi );
cosphi( 1 ) = 0;
cosphi( n + 1 ) = 0;
sintheta = sin( theta );
sintheta( 1 ) = 0;
sintheta( n + 1 ) = 0;

x = r * cosphi * cos( theta );
y = r * cosphi * sintheta;
z = r * sin( phi ) * ones( 1, n + 1 );

明德厚学、求是创新
3楼2016-01-27 16:41:01
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

碗碗儿2954

新虫 (小有名气)

引用回帖:
3楼: Originally posted by xiegangmai at 2016-01-27 16:41:01
简单写了下代码,楼主参考参考。

function spheres

n = 100;
r = rand( 1, n ) / 10;

for i = 1 : n
    color_value = rand( 1, 3 ); % 颜色
    position = rand( 1, 3 );  % 球心坐标
      = unit ...

好心人您好,我看了您的程序是可行的,但是我想要通过比较第 i 个球和前面生成的 (i-1)的球半径和与球心距离的大小来避免球体之间的重合,在总体积小于比如 v 的情况下,由于position只是任意的1*3数组,并不能存储第 i 个球体的位置信息?我想出的以下语句好像也有问题
while (VSUM<v)
     for m=1:i-1
         A=R(i)+R(m);
         B=sqrt((positionX(i)-positionX(m))^2+(positionY(i)-positionY(m))^2+(positionZ(i)-positionZ(m))^2);
         if (A<B)
            k=k+1;
         end
         continue
     end
end
努力!
4楼2016-01-28 09:14:49
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

xiegangmai

版主 (职业作家)

我没头衔

优秀版主优秀版主优秀版主


小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
4楼: Originally posted by 碗碗儿2954 at 2016-01-28 09:14:49
好心人您好,我看了您的程序是可行的,但是我想要通过比较第 i 个球和前面生成的 (i-1)的球半径和与球心距离的大小来避免球体之间的重合,在总体积小于比如 v 的情况下,由于position只是任意的1*3数组,并不能存储 ...

以下代码应该能实现楼主的要求。
算法不一定简练,如
1)判断任意球心距离与相应球半径和大小,可采用数组矢量计算避免循环;
2)比较总体积与设定体积大小,这里需要讨论,有可能这次while循环中随机生成的半径较大,可以增加判定条件。
供楼主参考,
CODE:
function spheres
clear
clc

n = 1000;
v = 0.5; % 总体积
VSUM = 0;
Position = zeros( n, 3 ); % 预设1000个圆球球心坐标
R = zeros( n, 1 ); % 预设1000个圆球半径
i = 1;
m = 1;
myflag = false;

while ( VSUM < v )
   
    m = m +1; % while 循环计数
   
    r = rand( 1 ) / 5; % 球半径
    position = rand( 1, 3 );  % 球心坐标

    for k = 1 : i % 判断任意球心距离与相应球半径和大小
        D = sqrt( ( position(1) - Position( k, 1 ) ) ^ 2 + ( position(2) - Position( k, 2 ) ) ^ 2 + ( position(3) - Position( k, 3 ) ) ^ 2);
        Rr = r + R( k );
        if D < Rr % 如果任意两球半径和大于相应的球心距离
            myflag = true; % 设定继续寻下一个球半径和球心的标记
            break; % 跳出for循环
        end
    end
   
    if myflag == true
        myflag = false;
        continue % 进行下一轮while循环
    end
   
    Vtemp = VSUM + 4 * pi * r .^3 / 3;
    if Vtemp > v % 比较总体积与设定体积大小,这里需要讨论(有可能这次while循环中随机生成的半径较大,可以设定条件)
        break
    end
    VSUM = VSUM + 4 * pi * r .^3 / 3;
    color_value = rand( 1, 3 ); % 颜色
    [ x, y, z ] = unitsphere;
    x =  r * x + position( 1 );
    y =  r * y + position( 2 );
    z =  r * z + position( 3 );
    h = surf( x, y, z);
    set( h, 'EdgeColor', 'none', ...
         'FaceColor', color_value  );
     hold on
         
     Position( i, : ) =  position; % 记录球心坐标
     R( i ) = r; % 记录球半径
     i = i + 1;

    if ( i > n ) || ( m > 10000) % 当球数目达设定上限或while循环达到上限,退出while循环
        break
    end
end
axis equal

i
m
VSUM

function [ x, y, z ] = unitsphere

r = 1; % 单位圆
n = 20;

theta = ( -n : 2 : n ) / n * pi;
phi = ( -n : 2 : n )' / n * pi / 2;

cosphi = cos( phi );
cosphi( 1 ) = 0;
cosphi( n + 1 ) = 0;
sintheta = sin( theta );
sintheta( 1 ) = 0;
sintheta( n + 1 ) = 0;

x = r * cosphi * cos( theta );
y = r * cosphi * sintheta;
z = r * sin( phi ) * ones( 1, n + 1 );

» 本帖已获得的红花(最新10朵)

明德厚学、求是创新
5楼2016-01-28 12:06:46
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

碗碗儿2954

新虫 (小有名气)

送红花一朵
引用回帖:
5楼: Originally posted by xiegangmai at 2016-01-28 12:06:46
以下代码应该能实现楼主的要求。
算法不一定简练,如
1)判断任意球心距离与相应球半径和大小,可采用数组矢量计算避免循环;
2)比较总体积与设定体积大小,这里需要讨论,有可能这次while循环中随机生成的半径 ...

您的程序写的真好,首先通过判断逻辑变量来决定是否生成小球,然后m=m+1避免了我的两个 for 语句嵌套操作,再有break和continue是我们非专业人士所困惑的,最后像 : 这类的符号我也是很佩服,说再多还是感谢您的宝贵时间!
努力!
6楼2016-01-29 09:46:51
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

碗碗儿2954

新虫 (小有名气)

引用回帖:
5楼: Originally posted by xiegangmai at 2016-01-28 12:06:46
以下代码应该能实现楼主的要求。
算法不一定简练,如
1)判断任意球心距离与相应球半径和大小,可采用数组矢量计算避免循环;
2)比较总体积与设定体积大小,这里需要讨论,有可能这次while循环中随机生成的半径 ...

我是学材料的,不知道有什么能帮得上您我有正版的MATLAB不知道您有没有需要?
努力!
7楼2016-01-29 09:49:08
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

灿烂豆沙包

木虫 (小有名气)

厉害

[ 发自手机版 http://muchong.com/3g ]
keepcalmandcarryon..
8楼2016-03-05 00:16:19
已阅   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 碗碗儿2954 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 建议基金发布提前给出明确的时间点 +9 kulium 2026-08-21 10/500 2026-08-21 19:19 by 诗眼倦天涯
[基金申请] 科研孤儿太难了 +16 我4大白菜 2026-08-20 17/850 2026-08-21 19:07 by sakuraai
[基金申请] 今日不放榜?网传国自然预计 8 月 27 日可查结果 +15 医学老男孩 2026-08-20 19/950 2026-08-21 18:54 by 医学老男孩
[基金申请] 看来今天不会放榜了? +8 chengyan1220 2026-08-21 11/550 2026-08-21 17:52 by dcqxinyang
[基金申请] 时间戳又变了 +13 wuchongjun 2026-08-20 19/950 2026-08-21 17:21 by 紫杉醇
[基金申请] filecode,4个jtjc了 +11 ziyangfang 2026-08-19 14/700 2026-08-21 16:51 by applepetty
[基金申请] 让我中一个面上吧! +11 大萍1987 2026-08-20 13/650 2026-08-21 14:48 by 20120902066
[基金申请] 人气不行了 +7 fansofjerry 2026-08-21 7/350 2026-08-21 14:13 by Vivilian
[基金申请] 什么时候开奖? +7 CrisMessi 2026-08-18 7/350 2026-08-21 12:15 by weiyin
[基金申请] 时间戳又变了8-15 +15 archvillain 2026-08-15 27/1350 2026-08-21 11:32 by tim76
[基金申请] 应该是下周三26日公布了吧? +4 哈哈蛤? 2026-08-21 4/200 2026-08-21 10:58 by Vivilian
[基金申请] 今天放榜没戏了吧 +9 yuleib84 2026-08-19 11/550 2026-08-21 10:06 by gltch
[基金申请] 基金啊基金 +4 longfie172 2026-08-20 4/200 2026-08-21 08:58 by mark mao
[基金申请] 放榜前的不淡定 40+4 snowwithsea 2026-08-19 13/650 2026-08-21 08:30 by 北京莱茵编辑
[基金申请] 估计是周四 +3 archvillain 2026-08-18 3/150 2026-08-21 01:48 by jnhyjjm
[基金申请] 今天放榜吗? +14 布布和一二 2026-08-19 15/750 2026-08-19 18:07 by gltch
[基金申请] 快农历七夕节了,轻松一下,男人悄悄话,女施主请不要进来。 +6 Tide man 2026-08-14 7/350 2026-08-19 09:56 by ZJTJZ
[基金申请] 明天放榜? +5 Shxjjxjkx 2026-08-18 5/250 2026-08-18 18:14 by -大大大大大-
[基金申请] 93BebMhtakh前后11位开头都是大写 +4 且听虎啸 2026-08-17 5/250 2026-08-18 00:49 by 蔡棒棒菂
[精细化工] 招聘 金属平磨液,抛光液研发工程师 +3 小天0311 2026-08-14 3/150 2026-08-16 07:31 by H9PLUS
信息提示
请填处理意见