0

次のコードを使用して、q、u の関数である三重積分を評価しようとしています。エラーを取得し、

Warning: Maximum function count exceeded; singularity likely. 
In quad at 107
In test1>Inner at 12
In test1>@(x)Inner(x) at 5
In quad at 76
In test1 at 5

このコードの何が問題なのか誰か知っていますか?

function [r] = test1(q,u)
b = u;
r = zeros(1);
for i = 1 : length(q);
    r(i) = quad(@(x)Inner(x),-2,q);
end;


function [w] = Inner(k)
w = zeros(1);
for i = 1 : length(k);
    w(i) = quad(@(n)InnerIntegral(n).*unifpdf(k(i)-n,-1,1),0,k(i)-1,k(i)+1);
end;



function [y] = InnerIntegral(n)
y = zeros(1);
for i = 1 : length(n);
    y(i) = quad(@(m)unifpdf(n(i)-m, -b, b).*unifpdf(m,-b,b), n(i)-b,n(i)+b);
end;
end
end
end
4

3 に答える 3

1

このように複数の関数を定義する場合、各関数のendステートメントは、への次の呼び出しの前に置く必要がありますfunction。現在、これはと呼ばれるサブ関数を持つ1つの巨大な関数でありInner、そのサブ関数にはと呼ばれるさらに別のサブ関数があるように見えInnerIntegralます。したがって、test1を呼び出そうとしていますが、の定義は、後での定義の内部まで発生しません。Inner`Innertest1

于 2012-04-24T02:46:03.977 に答える
1

私は同じ問題を抱えていましたが、うまくいく解決策に出くわしました。

quad(Function,lowerlimit,upperlimit) の代わりに quadgk(Function,lowerlimit,upperlimit) を使用してみてください

h番目

于 2014-05-25T04:41:42.973 に答える
0

問題は次のとおりです。

function [w] = Inner(k)
w = zeros(1);
for i = 1 : length(k);
    w(i) = quad(@(n)InnerIntegral(n).*unifpdf(k(i)-n,-1,1),0,k(i)-1,k(i)+1);
end

設定方法: w(i) = quad(@(n)fcc(n),0,k(i)-1 , k(i)+1 );

quad の最後の値が許容値として設定されます。私はあなたが0項を取り除きたいと思う:

w(i) = quad(@(n)InnerIntegral(n).*unifpdf(k(i)-n,-1,1),k(i)-1,k(i)+1);
于 2012-04-24T02:52:17.957 に答える