3

Matlabの境界x0とx1で指定されたxの範囲で関数f(x)を表すベクトルを数値積分したいと思います。積分の出力が正しく、収束していることを確認したいと思います。

必要なエラー許容度を特定するのに役立つquad関数とquadl関数がありますが、入力引数は関数である必要があり、関数の結果のベクトルではありません。2つのベクトルxとf(x)を入力できるtrapz関数もありますが、ベクトルxで使用される間隔に応じて、xに関するf(x)の積分を計算します。ただし、quadやquadlのように、trapzを使用して許容誤差を調整し、答えが収束していることを確認する方法はありません。

quadおよびquadl関数を使用できない主な問題は、f(x)が次の方程式であるということです。f(x)= sum(exp(-1/2 *(xy)))、合計はyを超えています。ここで、yは長さnのベクトルであり、xは関数f(x)に毎回与えられる要素です。したがって、ベクトルyのすべての要素が要素xから減算され、yの合計が計算されて、値f(x)が得られます。これは、mがnと等しくないxのm値に対して行われます。

Matlabのマニュアルで説明されているようにquadlを使用する場合、f(x)は別の関数.mファイルで定義され、次にメインの呼び出しファイルで定義されます。Q= quadl(@ f、x0、x1、tolerance、X、 Y); ここで、Xは長さmのベクトルであり、Yは長さLのベクトルです。Matlabはエラーを出します:「???==>マイナス行列の次元を使用したエラーは一致する必要があります。」.m関数ファイルで関数f(x)を定義する行で。f(x)= sum(exp(-1/2 *(xy)))

問題は、Matlabがxとyを互いに減算するときに同じ長さのベクトルとして扱うのに対し、必要なのはベクトルXの単一の要素から毎回ベクトルYを減算することだと思います。

この問題を解決し、許容誤差を制御する方法でf(x)とxを数値積分する方法をお勧めしますか?

4

2 に答える 2

3

それに関するドキュメントからquad

関数y=fun(x)は、ベクトル引数xを受け入れ、ベクトル結果yを返す必要があります。これは、xの各要素で評価される被積分関数です。

したがって、関数を呼び出すたびに、与えられたそれぞれの被積分関数を評価する必要がありxます。

また、定数ベクトルを使用して関数呼び出しをパラメーター化するYには、無名関数呼び出しをお勧めします。ここに妥当なデモがあります。Matlabで問題を実装した方法は次のとおりです。

function Q = test_num_int(x0,x1,Y)
  Q = quad(@(x) myFun(x,Y),x0,x1);
end

function fx = myFun(x,Y)
  fy = zeros(size(Y));
  fx = zeros(size(x));
  for jj=1:length(fx)
    for ii=1:length(Y)
      fy(ii) = exp(-1/2 *(x(jj)-Y(ii)));
    end
    fx(jj) = sum(fy);
  end
end

次に、関数を呼び出して、次の出力を取得しました。

Y = 0:0.1:1;
x0 = 0;
x1 = 1;
Q = test_num_int(x0,x1,Y)

Q =

   11.2544

下限と上限、および定数配列の入力は明らかに単なるダミー値ですが、積分は非常に迅速に、ほぼ即座に収束します。お役に立てれば!

于 2012-09-18T15:01:58.650 に答える
1

私は次のこともうまくいくと信じています:

y = randn(10,1); 
func = @(x) sum(exp(-1/2 *(x-y)));
integral(func,0,1,'ArrayValued',true)
于 2016-09-02T18:50:41.163 に答える