声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1806|回复: 4

[综合讨论] 如何在function函数中调用其他.m文件

[复制链接]
发表于 2013-5-9 16:06 | 显示全部楼层 |阅读模式

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

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

x
.m文件包含的内容为大量的已知数值的基本参数,命名为basic_para.m。因为这些参数需要在多个程序中使用(包括function函数),如果修改其中之一,在其他的文件中也要相应做出修改。这样做一来繁琐,二来可能因疏忽导致某个文件中的参数没有修改从而造成计算结果的错误。
在非函数命名文件中可以调用basic_para(直接输入文件名即可),但尝试在function调用时却没有任何结果,只好手动的复制粘贴。
想请教一下大家,像这样的情况如何在命名的function函数文件中调用上述的basic_para.m文件。
回复
分享到:

使用道具 举报

发表于 2013-5-9 22:32 | 显示全部楼层
...但尝试在function调用时却没有任何结果...

不应该会如此!?
与在非函数文件中都同样直接输入文件名调用
 楼主| 发表于 2013-5-10 09:02 | 显示全部楼层

ChaChing前辈,你好!我所做的是求解一个二阶常微分方程组,用ode45,具体的程序如下:
基本参数,命名为basic_para.m:


  1. %------------------------- 系统基本参数 -------------------------%

  2. m = 300*10^3;               
  3. Ke = 0.5*10^10;            
  4. De = 0.5*10^5;              
  5. g = 9.81;                  

  6. b = 0.2;
  7. n = 2.5;
  8. tau0 = 0.5;                 
  9. n0 = 0.079;
  10. m0 = -0.25;                 
  11. xi = 1.5;                  
  12. R = 2.925;                  
  13. L = 0.43;                  
  14. v = 3.537;                  
  15. c = 2.5*10^-3;              
  16. gamma = 1.3*10^-3;         
  17. delta_P = 0.5*10^6;


复制代码


系统运动微分方程,命名为equ_seal


  1. function uu = equ_seal(T,u)

  2. global w
  3. basic_para;

  4. Ra = 2*v*c/gamma;
  5. Rv = R*c*w/gamma;
  6. lambda = n0*Ra.^m0 * (1 + (Rv/Ra).^2).^((1+m0)/2);
  7. sigma = lambda*L/c;
  8. B = 2 - ((Rv/Ra).^2 - m0) / ((Rv/Ra).^2 + 1);
  9. E = (1+xi)/(1+xi+2*sigma);
  10. mu0 = 2*sigma^2/(1+xi+2*sigma) * E*(1-m0);
  11. mu1 = 2*sigma^2/(1+xi+2*sigma) * (E/sigma + B/2 * (1/6 + E));
  12. mu2 = sigma/(1+xi+2*sigma) * (1/6 + E);
  13. mu3 = pi*R*delta_P/lambda;
  14. T = L/v;

  15. K0 = mu3*mu0;
  16. D0 = mu1 * mu3 * T;



  17. %-------------------------- 变换后涉及到的阻尼和刚度表达式 -----------------------%

  18. e = sqrt(u(1)^2 + u(3)^2);              

  19. tauf = tau0 * (1-e).^b;  
  20. mf = mu2*mu3*T^2;                       
  21. D = D0 * (1-e^2).^(-n);                 
  22. K = K0 * (1-e^2).^(-n);                 

  23. M = m + mf;
  24. K1 = (Ke + K - tauf^2 * w^2 * mf) / (M*w^2);
  25. K2 = tauf * D/(M*w);
  26. D1 = (De + D)/(M*w);
  27. D2 = 2*tauf*mf/M;               
  28. G = -m*g / (M*c*w^2);

  29. %-------------------------- 系统运动微分方程 -----------------------%

  30. uu = zeros(4,1);
  31. uu(1) = u(2);
  32. uu(2) = -D1*u(2) - D2*u(4) - K1*u(1) - K2*u(3);
  33. uu(3) = u(4);
  34. uu(4) =  D2*u(2) - D1*u(4) + K2*u(1) - K1*u(3) + G;         

复制代码


最后求解系统运动微分方程




  1. % 求解系统运动微分方程

  2. clc
  3. clear all
  4. global w
  5. tic

  6. w_sub = 300:100:500;

  7. y0 = [0.1 0.1 0.1 0.1];

  8. for i = 1:length(w_sub)
  9.     w = w_sub(i);
  10.     period = 2*pi;
  11.     step = period/200;
  12.     tsapn = 0:step:1200*period;

  13.     disp(w)
  14.     [t,u] = ode45('equ_seal',tsapn,y0);

  15. end

  16. toc


复制代码



                系统会提示
“??? Error using ==> gamma
Not enough input arguments.

Error in ==> equ_seal at 30
Ra = 2*v*c/gamma;”

但比较奇怪的是为什么直到gamma出现才显示错误提示,basic_para中的第一个参数应该是m才对。如果将basic_para中的每一个参数都输入到equ_seal函数中则不会出现任何问题。请教一下ChaChing这是什么情况造成的。









发表于 2013-5-10 09:32 | 显示全部楼层
本帖最后由 chybeyond 于 2013-5-10 09:48 编辑

gamma这个变量你换一下,与matlab自带的函数冲突

评分

1

查看全部评分

 楼主| 发表于 2013-5-11 18:34 | 显示全部楼层
chybeyond 发表于 2013-5-10 09:32
gamma这个变量你换一下,与matlab自带的函数冲突

非常感谢你的帮助!确实如你所说,将gamma更改为其他名称后就可以了。以前不知道gamma还是matlab的自带函数,这回学习到了新的东西。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-10 21:59 , Processed in 0.064230 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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