声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1176|回复: 6

[编程技巧] 循环的问题,请高手指点

[复制链接]
发表于 2006-9-10 15:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
function z=f(x)
l=[10.023        7.081        0.023        -7.031        -10.061        -7.073        0        7.031        20.024        14.144        0.003        -14.147        -20.002        -14.145        0.002        14.133        30.004        21.213        0.002        -21.217        -30.001        -21.212        0.003        21.217        40.001        28.284        0.002        -28.279        -40.002        -28.28        0.002        28.283        50.002        35.355        0.003        -35.357        -50.001        -35.356        0.002        35.358];
m=[0.012        7.071        10.03        7.085        0.003        -7.081        -10.034        -7.074        0.081        14.101        20.002        14.138        0.001        -14.122        -20.001        -14.147        0.003        21.215        30.002        21.218        0.002        -21.221        -30.001        -21.225        0.005        28.287        40.005        28.283        0.001        -28.283        -40.003        -28.278        0.002        35.356        50.005        35.355        0.003        -35.354        -50.003        -35.359];
n=[100.02        100.003        100.013        100.005        100.001        100.027        100.007        100.045        400.037        400.004        400.003        400.001        400.01        400.011        400.003        400.001        900.003        900.002        900.004        900.001        900.006        900.009        900.003        900.005        1600.005        1600.004        1600.001        1600.004        1600.002        1600.007        1600.01        1600.001        2500.007        2500.001        2500.008        2500.002        2500.004        2500.003        2500.005        2500.001];
%for k= 1:40
  %  li(k)=(l(k)+x(1))*cos(x(5))*cos(x(6))
  %  mi(k)=(m(k)+x(2))*cos(x(4))*cos(x(6))
  %  ni(k)=(n(k)+x(3))*cos(x(4))*cos(x(5))
%end

for k=1:40
r(k)=sqrt((l(k)-x(1)*cos(x(2)))^2+(m(k)-x(1)*sin(x(2)))^2+(n(k)-x(1)^2)^2)

x0=[0,0];[x,fval]=fminunc(@ziyouqumian_biaozhunfangcheng,x0);
end

这是求点到曲面的最短距离的函数,我本来想把每个r的最小值都求出来,再找出max(r)-min(r),可是怎样才能在循环中执行commandwindow中的命令x0=[0,0];[x,fval]=fminunc(@ziyouqumian_biaozhunfangcheng,x0)啊?小弟不懂,请高手指教

[ 本帖最后由 xuebx 于 2006-9-11 09:38 编辑 ]
回复
分享到:

使用道具 举报

 楼主| 发表于 2006-9-10 15:43 | 显示全部楼层
曲面是 x(u,w)=u*cos(w)
             y(u,w)=u*sin(w)
             z=u^2
求离散点到曲面的最短距离中的最大值与最小值之差,请大家指教
 楼主| 发表于 2006-9-10 16:26 | 显示全部楼层
function r=f3(x)
r=sqrt((10.023-x(7)*cos(x(8)))^2+(0.012-x(7)*sin(x(8)))^2+(100.02-x(7)^2)^2)
commandwindow中执行的命令是x0=[0,0];[x,fval]=fminunc(@ziyouqumian_biaozhunfangcheng,x0),这是第一个点的距离曲面的最短距离,我想用循环来依次求出这四十个点到曲面的距离,最后再求出最大值与最小值的差,大家帮忙想想办法
发表于 2006-9-10 18:50 | 显示全部楼层
把下面的程序给你参考一下,逻辑上没有什么问题,现在最关键的问题在于fminunc这个函数的使用上。
对于这类我通常是采用inline来解决的,不知道有没有高人有其他更好的方法。我一直对函数句柄理解的不是很明白,不知道函数句柄到底能不能解决这个问题。
clc;clear;
l=[10.023        7.081        0.023        -7.031        -10.061        -7.073        0        7.031        20.024        14.144        0.003        -14.147        -20.002        -14.145        0.002        14.133        30.004        21.213        0.002        -21.217        -30.001        -21.212        0.003        21.217        40.001        28.284        0.002        -28.279        -40.002        -28.28        0.002        28.283        50.002        35.355        0.003        -35.357        -50.001        -35.356        0.002        35.358];
m=[0.012        7.071        10.03        7.085        0.003        -7.081        -10.034        -7.074        0.081        14.101        20.002        14.138        0.001        -14.122        -20.001        -14.147        0.003        21.215        30.002        21.218        0.002        -21.221        -30.001        -21.225        0.005        28.287        40.005        28.283        0.001        -28.283        -40.003        -28.278        0.002        35.356        50.005        35.355        0.003        -35.354        -50.003        -35.359];
n=[100.02        100.003        100.013        100.005        100.001        100.027        100.007        100.045        400.037        400.004        400.003        400.001        400.01        400.011        400.003        400.001        900.003        900.002        900.004        900.001        900.006        900.009        900.003        900.005        1600.005        1600.004        1600.001        1600.004        1600.002        1600.007        1600.01        1600.001        2500.007        2500.001        2500.008        2500.002        2500.004        2500.003        2500.005        2500.001];
tem_v=[];
x0=[0,0];
k=1;
result=[];
result_fval=[];
for k=1:40
    x=sym('[x(1),x(2)]');
    r=sqrt((l(k)-x(1)*cos(x(2)))^2+(m(k)-x(1)*sin(x(2)))^2+(n(k)-x(1)^2)^2);
    f=inline(r);
    x0=[0,0];
    [x,fval]=fminunc(f,x0);
    result(k,:)=x;
    result_fval(k,:)=fval;
end
distance=max(result_fval)-min(result_fval);
disp(distance);

评分

1

查看全部评分

 楼主| 发表于 2006-9-10 20:01 | 显示全部楼层
我好好研究一下,谢谢啦
发表于 2006-9-11 08:36 | 显示全部楼层
[x,fval]=fminunc(fun,x0,options,p1,p2,…)

可以通过p1 p2传递变量
发表于 2006-10-10 09:03 | 显示全部楼层

曲面參數方程

請問各位高手如何確定任意曲面的參數方程啊?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-12 16:55 , Processed in 0.079117 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表