声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5525|回复: 17

[编程技巧] 关于带参数的积分出现Not enough inputs to inline function的问题

[复制链接]
发表于 2007-11-20 09:15 | 显示全部楼层 |阅读模式

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

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

x
z=linspace(-0.1,0.1);
a=0.1;
kesi=(z+sqrt(z.^2-a^2))./a;
for i=1:length(z)
    k=kesi(i);
    fun=strcat('log(1-((b+sqrt(b.^2-a^2))./a)./',(num2str(k)),')');
    I(i)=quadl(inline(fun),-0.1,0.1);
end
报错:
??? Error using ==> inline.feval
Not enough inputs to inline function.

Error in ==> quadl at 64
y = feval(f,x,varargin{:}); y = y(:).';

xjzuo 的例子如下:
clear all
k=linspace(0,5);
for i=1:length(k)
    kk=k(i);
    fun=strcat('sin(',num2str(kk),'*x).*x.^2');
    y(i)=quadl(inline(fun),1,5);
end
plot(k,y)

====================
请将公式帖一下,以便确定问题。
By xjzuo
====================

[ 本帖最后由 xjzuo 于 2007-11-22 09:17 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-11-20 09:24 | 显示全部楼层
原帖由 sigma665 于 2007-11-20 09:15 发表
z=linspace(-0.1,0.1);
a=0.1;
kesi=(z+sqrt(z.^2-a^2))./a;
for i=1:length(z)
    k=kesi(i);
    fun=strcat('log(1-((b+sqrt(b.^2-a^2))./a)./',(num2str(k)),'');
    I(i)=quadl(inline(fun),-0.1, ...

带参数的积分有好几个帖子的,已在置顶帖中整理了,请阅读一下。实在找不到就搜索一下,看看成功的示例吧
 楼主| 发表于 2007-11-20 09:33 | 显示全部楼层

我换成这样,有结果了

我换成这样,有结果了

z=linspace(-0.1,0.1);
a=0.1;
kesi=(z+sqrt(z.^2-a^2))./a;
for j=1:length(z)
    f=@(b)(log(1-((b+sqrt(b.^2-a^2))./a)./kesi(j))); % 被积函数
    I(j)=quadl(f,-0.1+eps,0.1+eps,1e-8);
    III(j)=roundn(double(I(j)),-4); % 将符号变量转化为数字
end

我想用不同的方法,看得到的结果是否相同,要不心里没底
 楼主| 发表于 2007-11-20 09:37 | 显示全部楼层

回复 #2 eight 的帖子

我都看了,可是我实在天资愚钝,需要指点一二
 楼主| 发表于 2007-11-20 09:53 | 显示全部楼层
"Not enough inputs to....,"是因为你定义了两个变量.

可是xjzuo 的例子怎么就可以,我完全参考他的
发表于 2007-11-20 12:07 | 显示全部楼层

回复 #3 sigma665 的帖子

把a=0.1的值代入画出的图形不一样,有点迷惑?
z=linspace(-0.1,0.1);
kesi=(z+sqrt(z.^2-0.01))*10;
for j=1:length(z)
    k=kesi(j);
    fun=strcat('log(1-((b+sqrt(b.^2-0.01))*10)./',(num2str(k)),')');
    y(j)=quadl(inline(fun),-0.1,0.1);
end
plot(z,real(y))
 楼主| 发表于 2007-11-20 15:38 | 显示全部楼层
%%% example01 %%%%  
z=linspace(-0.1,0.1);
a=0.1;
kesi=(z+sqrt(z.^2-a^2))./a;
for j=1:length(z)
   
f=@(b) log(1-((b+sqrt(b.^2-a^2))./a)./kesi(j)); % 被积函数
    I(j)=quadl(f,-0.1+eps,0.1+eps,1e-8);
end


%%% example02 %%%%  
z=linspace(-0.1,0.1);
a=0.1;
kesi=(z+sqrt(z.^2-a^2))./a;
for i=1:length(z)
    k=kesi(i);
    fun=strcat('log(1-((b+sqrt(b.^2-0.1^2))./0.1)./',num2str(k),')');
    II(i)=quadl(inline(fun),-0.1+eps,0.1+eps);
end

%%% example03 %%%%
z=linspace(-0.1,0.1);
a=0.1;
kesi=(z+sqrt(z.^2-a^2))./a;
for i=1:length(z)
    k=kesi(i);
    fun=inline(subs('log(1-((b+sqrt(b^2-0.1^2))/0.1)/kesi)','kesi',k));
    III(i)=quadl(fun,-0.1+eps,0.1+eps);
end


%%% example04 %%%%  
z=linspace(-0.1,0.1);
a=0.1;
kesi=(z+sqrt(z.^2-a^2))./a;
ff=@(k) ['log(1-((b+sqrt(b.^2-0.1^2))./0.1)./',num2str(k),')']; % 被积函数
f=@(k) quadl(ff(k),-0.1+eps,0.1+eps);
for i=1:length(z)
IIII(i)=f(kesi(i));
end

%%% example05 %%%%  
clear all;clc;
a=0.1;
f=@(kesi) quadl(@(b) log(1-((b+sqrt(b.^2-a^2))./a)./kesi),-0.1+eps,0.1+eps)
z=linspace(-0.1,0.1);

kesi=(z+sqrt(z.^2-a^2))./a;
y=zeros(size(z));
for ii=1:length(z)
IIIII(ii)=f(kesi(ii));
end


%%example06 %%%%
a=0.1;
z=linspace(-0.1,0.1);
kesi=(z+sqrt(z.^2-a^2))./a;
IIIIII=arrayfun(@(kesi) quad(@(b)  log(1-((b+sqrt(b.^2-a^2))./a)./kesi),-0.1+eps,0.1+eps),kesi);


以上程序都可以积出来,其中1,3,5,6结果相同,2,4相同
也就是说凡是用到NUM2STR的结果与其他不一样。
这也正是LS的那位的迷惑,我也同样迷惑
再次感谢LS

希望高人能答疑解惑

[ 本帖最后由 sigma665 于 2007-11-20 17:39 编辑 ]
 楼主| 发表于 2007-11-21 15:00 | 显示全部楼层
大家说说,哪个结果可靠
发表于 2007-11-21 23:50 | 显示全部楼层
不要生搬硬套,注意先理解示例贴。
另:仔细检查一下,即可发现问题。

评分

1

查看全部评分

 楼主| 发表于 2007-11-22 10:17 | 显示全部楼层

积分方程见图

对x进行积分,结果我都有了,参见7楼。
现在的问题是上面几种不同方法,会有2种结果。
迷惑中

说明一下,图中,积分方程得到的是一个关于kesi的一个方程。
然后根据kesi的不同变化,得到不同的f值

[ 本帖最后由 sigma665 于 2007-11-22 10:19 编辑 ]
未命名.JPG
 楼主| 发表于 2007-11-22 10:32 | 显示全部楼层
In example02, for the value of kesi, you use num2str(k).
num2str() by default only outputs 5 non-zero digits after the
decimal point if the number is less than 1, and outputs four digits
after the decimal point if the number is greater than 1.

in example03, for the value of kesi, you would get the full internal
precision of k.

Therefor the two examples can have different results because they are
working on slightly different problems resulting from the truncation
of the actual value in example02.

A similar truncation situation exists in example04.


这是一个老外论坛上,老外给我讲的。看来是num2str有问题
发表于 2007-11-22 11:36 | 显示全部楼层
很难想象这是原问题------sigma=kesi?结果为0? 参数也不存在变化......
另外:老外的建议可参考,但并不一定对......
 楼主| 发表于 2007-11-22 13:17 | 显示全部楼层
积分是对x积分,得到一个关于kesi的函数表达式
然后对于不同的kesi值,就会有不同的f值
发表于 2007-11-22 17:03 | 显示全部楼层
老实讲,先不说你套用代码时有问题,你的问题本身就有问题。------泛函不象泛函。
请帖一下原问题及背景。
 楼主| 发表于 2007-11-22 19:37 | 显示全部楼层
具体见图

补充:a=0。1是半裂纹长度,积分方程是要沿着裂纹表面进行积分.

本来,如果可以手算的话,是先对x积分,然后再带入不同的kesi值,但是在matlab里,需要先给定kesi值,然后才能积分。
这应该是一样的。

简单的例子:
f(y)=int(x+y)dx, 这里int表示积分符号,得到f(y)=x^2/2+xy+C, 是一个关于y的函数。
至于y,可能也是关于其他变量的函数。

我明白你的意思了,你是说sigma,kesi都是x的函数,直接带入就消掉了。
应该说,两者里面的x具有不同含义,sigma表示在单位圆平面里的单位圆边界,而kesi是该平面内的所有点,
积分是对sigma里的x进行积分。

[ 本帖最后由 sigma665 于 2007-11-22 19:52 编辑 ]
1.JPG
2.JPG
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-14 03:38 , Processed in 0.094652 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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