声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2083|回复: 10

[编程技巧] 关于inline函数的使用问题

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

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

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

x
想把dfdx0换成数组dfdx1,再积分,怎么不行呢?

clear
clc
syms x z dfdx0
cfun=inline('5e13*cosh(dfdx0*z./1e6)','z','dfdx0')
sfun=inline('5e13*sinh(dfdx0*z./1e6)','z','dfdx0')

f=(1-x.^2).^(1/2);
dfdx=diff(f);
x1=-1:0.05:1;
dfdx1=subs(dfdx,x,x1);
Cfun=subs(cfun,dfdx0,dfdx1)
Sfun=subs(sfun,dfdx0,dfdx1)
A=quad(cfun,z,0,1e-7)
B=quad(sfun,z,0,1e-7)


??? Error using ==> inline.subsref
Not enough inputs to inline function.
Error in ==> quad at 62
y = f(x, varargin{:});
Error in ==> yy at 17
A=quad(cfun,z,0,1e-7)

[ 本帖最后由 eight 于 2007-8-30 13:28 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-8-30 09:54 | 显示全部楼层
你的程序问题太多,例如连最基本的quad用法都有问题.
------这种问题参考我的一些示例贴很容易解决.

另:最好将原问题一并贴出来,这样别人就很容易给你好建议.
 楼主| 发表于 2007-8-30 22:12 | 显示全部楼层

回复 #2 xjzuo 的帖子

今天看了您的示例帖受益匪浅。后来,又把自己的程序改了一下,好了一些。不过还是有点问题。刚学不久,很多问题都不懂。请版主多多指教。


clear;clc
s0=0:0.05:0.3;
syms l1 x z dpdx

n2=100;             l=16.52;  L=l*0.001;      R=0.015;        E=2.2637e11;  
v0=0.03527432;  vi=2.19e-8;      ss=3e6;
ff=zeros(6,length(s0));
for i=1:6
    W=i*1000;
    f=[];
        for j=1:length(s0)
        s1=s0(j);
        u2=n2*pi*R/30;     u1=((2-s1).*u2)./(2+s1);   u=(u1+u2)./2;   uc=u2-u1;
        hmin=(2.65*vi^0.54*(v0*u).^0.7*R^0.43*L^0.13/E^0.03)./W.^0.13;
        hc=hmin*4/3;
        b=(8*W*R/pi/L/E).^(0.5);
        ph=2*W/L/b/pi;            
        p=ph*(1-x.^2/b^2).^(1/2);
        dpdx=vpa(diff(p));        
        ch=strcat(num2str(ss),'*cosh(dpdx*z/',num2str(ss),')/',num2str(v0));
        sh=strcat(num2str(ss),'*sinh(dpdx*z/',num2str(ss),')/',num2str(v0));
        cH=vpa(subs(ch,'dpdx',dpdx));
        sH=vpa(subs(sh,'dpdx',dpdx));
        CH=int(cH,z,0,hc);
        SH=int(sH,z,0,hc);
        c=vpa((uc*CH-SH*(CH^2-SH^2+uc^2)^0.5)/(CH^2-SH^2));
        q=subs(strcat('dpdx*',num2str(hc),'+',num2str(ss),'*sinh(c)'),'dpdx',dpdx);
        q=vpa(subs(q,'c',c));
        fun=inline(q);
        F1=quadl(fun,(-b),b)
        F2=int(F1,l1,(-L/2),L/2);      
        f(j)=double(F2/W);
    end  
    ff(i,:)=f;
end
ff
plot(s0,ff,'-*')
发表于 2007-8-31 09:52 | 显示全部楼层
看来你并没有理解我的程序本意,而且有滥用的嫌疑。
你现在的程序看上去既不简洁,也不美观,更糟糕的是你用的还是符号计算。所以基本上我不认为这种程序有什么意义。
另: l1的出现基本上与y没有什么区别-----你能说出F1是l1的函数吗?
-----请将问题及公式用word上传一下吧,否则很难猜测你究竟想算什么。

有时间的话,我会再写一个示例程序,以便大家再次碰到这种问题时有个参考。
 楼主| 发表于 2007-8-31 16:40 | 显示全部楼层

回复 #4 xjzuo 的帖子

其实我自己也这么认为。只是现在太菜了。先能算出结果来,增强一下信心,然后再追求简洁和美观。麻烦您了。:@)

[ 本帖最后由 twomao 于 2007-8-31 17:01 编辑 ]

新建 Microsoft Word 文档.doc

17 KB, 下载次数: 9

 楼主| 发表于 2007-8-31 22:23 | 显示全部楼层
编程技术实在不行,所以只好加注释了。
另:l1或y确实没有用,所以,我也删掉了。请版主批评指正。:@)


% ============================================================================
clear;clc
s0=0:0.05:0.3;
syms x z dpdx

n2=100;         l=16.52;         L=l*0.001;      R=0.015;      E=2.2637e11;  
v0=0.03527432;  vi=2.19e-8;      ss=3e6;
ff=zeros(6,length(s0));
for i=1:6
    W=i*1000;
    f=[];
        for j=1:length(s0)
        s1=s0(j);
        u2=n2*pi*R/30;     u1=((2-s1).*u2)./(2+s1);   u=(u1+u2)./2;   uc=u2-u1;
        hmin=(2.65*vi^0.54*(v0*u).^0.7*R^0.43*L^0.13/E^0.03)./W.^0.13;
        hc=hmin*4/3;
        b=(8*W*R/pi/L/E).^(0.5);
        ph=2*W/L/b/pi;            
        p=ph*(1-x.^2/b^2).^(1/2);
        dpdx=vpa(diff(p));         
        %以上准备工作
        
        %以下积分求CH、SH、c        
        ch1=strcat(num2str(ss),'*cosh(dpdx*z/',num2str(ss),')/',num2str(v0));
        sh1=strcat(num2str(ss),'*sinh(dpdx*z/',num2str(ss),')/',num2str(v0));
        ch=subs(ch1,'dpdx',dpdx);  %因为最终要对x积分,所以需要将dpdx关于x的表达式代入
        sh=subs(sh1,'dpdx',dpdx);  %因为最终要对x积分,所以需要将dpdx关于x的表达式代入
        cH=inline(ch)        
        sH=inline(sh)
        CH=quadl(cH,z,0,hc)        %这一句有问题。这一句完成后,CH应该是x的函数。
        SH=quadl(sH,z,0,hc)
        c=(uc*CH-SH*(CH^2-SH^2+uc^2)^0.5)/(CH^2-SH^2)
        
        
        %以下将CH、SH、c代入求被积函数fun
        q=subs(strcat('dpdx*',num2str(hc),'+',num2str(ss),'*sinh(c)'),'dpdx',dpdx);
        q=vpa(subs(q,'c',c));
        fun=inline(q);
        
        %以下积分求F2,进而求f
        F1=quadl(fun,(-b),b)
        F2=quadl(F1,(-L/2),L/2);      
        f(j)=double(F2/W);
    end  
    ff(i,:)=f;
end
ff
plot(s0,ff,'-*')
% ================================================================================

[ 本帖最后由 twomao 于 2007-8-31 22:27 编辑 ]

新建 Microsoft Word 文档.doc

28 KB, 下载次数: 5

发表于 2007-9-1 09:58 | 显示全部楼层
问题还是没有讲清楚.
从你上传的Word 文档看, F的被积函数"只是x的函数",怎么可能求二重积分呢?难道你还要对常数积一次分?
 楼主| 发表于 2007-9-1 10:00 | 显示全部楼层

回复 #7 xjzuo 的帖子

是的,就是再对常数积分一次.版主,我在6楼把程序分段了,看起来可能会好一些.

[ 本帖最后由 twomao 于 2007-9-1 10:03 编辑 ]
发表于 2007-9-1 10:16 | 显示全部楼层
你的程序我没有兴趣仔细看, 明显地, CH=quadl(cH,z,0,hc),SH=quadl(sH,z,0,hc)中"z"要去掉.

有时间我会写一个数值计算的示例程序,以便有人碰到此类问题时有个参考.
 楼主| 发表于 2007-9-1 10:23 | 显示全部楼层

回复 #9 xjzuo 的帖子

可是cH和sH含有x与z两个变量。
去掉后,就不知道对哪个变量积分了。出现提示:
??? Error using ==> inline.feval
Not enough inputs to inline function.
这几天,太麻烦您了.我自己再看看吧.再次感谢几天来您的关注.

[ 本帖最后由 twomao 于 2007-9-1 10:51 编辑 ]
 楼主| 发表于 2007-9-1 17:11 | 显示全部楼层
这个问题可以这样描述:
求一个定积分,被积函数为x,其中含有两个中间变量。
这两个中间变量有点特殊,它们都是x的函数,而且是对z求定积分而得到。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-18 19:56 , Processed in 0.094400 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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