声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2567|回复: 9

[编程技巧] inline使用问题

[复制链接]
发表于 2007-6-22 14:21 | 显示全部楼层 |阅读模式

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

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

x
inline其调用格式为fun=inline(‘函数内容’,自变量列表)
如ff=inline('[y(2);c2*sin(x*pi*3/4)-y(2)/2-sin(y(1))]',...
   'x','y','flag','c2');
但是有时候[y(2);c2*sin(x*pi*3/4)-y(2)/2-sin(y(1))]部分较为复杂
想将[]内这部分内容先定义好如:
f1=y(2)
f2=c2*sin(x*pi*3/4)-y(2)/2-sin(y(1))
这样[]内只需写成[f1;f2]的形式

但是就是在上述想法的实现过程中,搞不定!
请大虾帮忙实现一下
有的时候可能是几十组方程,就更有必要在外面定义好,再将f1;f2。。。写到括号内!
回复
分享到:

使用道具 举报

发表于 2007-6-22 17:13 | 显示全部楼层
不知道你的确切意思,是不是这个意思:
syms x y z;
f=x*y+z;
............(一系列运算)
mf=inline(f,'x','y','z');
 楼主| 发表于 2007-6-22 17:46 | 显示全部楼层
本来是这样的形式fun=inline('[y(2);sin(w(2)*t)-2*w(1)*y(1)-3*y(2)]','t','y','flag','w');

现在想写成这样一种形式
fun=inline('[f1;f2]','t','y','flag','w');
f1=y(2)
f2=sin(w(2)*t)-2*w(1)*y(1)-3*y(2)
这样看起来明了,且在处理多组方程时更好。
但是不知道怎么实现,我试了以下这种方式
function dydt=f(t,y)
f1=y(2)
f2=sin(w(2)*t)-2*w(1)*y(1)-3*y(2)
dydt=[f1;f2]
没有搞定
请大家多多指教
发表于 2007-6-22 23:07 | 显示全部楼层
看来还是没有理解我的示例程序的本意----抓住编程的技巧,而不是生搬硬套.
提示: 为了简洁起见,编写function,按照示例程序的思路求解即可.
(虽然用inline也可以实现,不过稍欠简洁)
 楼主| 发表于 2007-6-23 11:04 | 显示全部楼层
谢谢楼主的提醒

开始我的思路就是生搬硬套

因为这个语言对我来说就是个工具,用完以后可能永远没有再用的机会

觉得没有必要弄得明白

既然这样我就硬着头皮再看看

艾,其实这个课题就因该再找个处理程序这方面的人
 楼主| 发表于 2007-6-24 17:00 | 显示全部楼层
写成如下形式:
function dongtai
clear all
tsp=[0 10];
y0=[1 1];
k=[1 3 1 1 2 1 4 1 8 1 ];
for i=1:10
   [t,y]=ode45(@f,tsp,y0,[],k(i));
   plot(t,y)
end
function dydt=f(t,y)
f1=y(2)
f2=sin(k(i)*t)-2*y(1)-3*y(2)
dydt=[f1;f2]
出现??? Error using ==> shiyan>f
Too many input arguments.
的错误,不知为什么啊
发表于 2007-6-24 20:29 | 显示全部楼层
  1. function dydt=f(t,y)

  2. f1=y(2)

  3. f2=sin(k(i)*t)-2*y(1)-3*y(2)

  4. dydt=[f1;f2]
复制代码


显然不对,k都没传递进来

修改后如下:
  1. function dydt=f(t,y,k)
  2. f1=y(2);
  3. f2=sin(k*t)-2*y(1)-3*y(2);
  4. dydt=[f1;f2];
复制代码
 楼主| 发表于 2007-6-24 21:01 | 显示全部楼层
真的很感谢happy的回复

问题解决了:victory:

还想问一个问题:就是用ode45在算微分方程的时候
                        以上t的区间定义为0到10
                        而参数改变也是10次
                        是不是在计算0到1这段时,f中的k取1,;当计算区间到达1时是不是就将f中的k取成3;依次类推。
                        如果计算区间还是0到10,而参数改变20次,是不是就没0.5个区间改变一次参数。
                        感觉奇怪的就是在0到1或是1到2 等等的计算中,要根据精度确定步长,可想而之每个单位长度如0到1区间就要进行很多次的积分运算,计算多少次替换参数,不知通过什么控制。
                         是不是按照我刚才的想法平均分阿,是不是通过ode中那个flag控制阿
请高手解答,谢谢!
 楼主| 发表于 2007-6-25 10:11 | 显示全部楼层
是不是我没有把问题说情楚,大家不理解阿?

这问题对于知道的人应该很简单吧
发表于 2007-6-25 10:21 | 显示全部楼层
自己试一下不就明白了?
既然你觉得没人理解得了你的问题,那请到别的论坛去问吧.
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-5-16 12:52 , Processed in 0.220454 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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