sigma665 发表于 2007-11-20 09:15

关于带参数的积分出现Not enough inputs to inline function的问题

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 编辑 ]

eight 发表于 2007-11-20 09:24

原帖由 sigma665 于 2007-11-20 09:15 发表 http://www.chinavib.com/forum/images/common/back.gif
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, ...
带参数的积分有好几个帖子的,已在置顶帖中整理了,请阅读一下。实在找不到就搜索一下,看看成功的示例吧

sigma665 发表于 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

我想用不同的方法,看得到的结果是否相同,要不心里没底

sigma665 发表于 2007-11-20 09:37

回复 #2 eight 的帖子

我都看了,可是我实在天资愚钝,需要指点一二

sigma665 发表于 2007-11-20 09:53

"Not enough inputs to....,"是因为你定义了两个变量.

可是xjzuo 的例子怎么就可以,我完全参考他的

aiguo 发表于 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))

sigma665 发表于 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 编辑 ]

sigma665 发表于 2007-11-21 15:00

大家说说,哪个结果可靠

xjzuo 发表于 2007-11-21 23:50

不要生搬硬套,注意先理解示例贴。
另:仔细检查一下,即可发现问题。

sigma665 发表于 2007-11-22 10:17

积分方程见图

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

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

[ 本帖最后由 sigma665 于 2007-11-22 10:19 编辑 ]

sigma665 发表于 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有问题

xjzuo 发表于 2007-11-22 11:36

很难想象这是原问题------sigma=kesi?结果为0? 参数也不存在变化......
另外:老外的建议可参考,但并不一定对......

sigma665 发表于 2007-11-22 13:17

积分是对x积分,得到一个关于kesi的函数表达式
然后对于不同的kesi值,就会有不同的f值

xjzuo 发表于 2007-11-22 17:03

老实讲,先不说你套用代码时有问题,你的问题本身就有问题。------泛函不象泛函。
请帖一下原问题及背景。

sigma665 发表于 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] 2
查看完整版本: 关于带参数的积分出现Not enough inputs to inline function的问题