積分区間に変数を入れ​ると計算できなくなり​ます.なぜでしょうか​?

13 views (last 30 days)
ryohei yanagawa
ryohei yanagawa on 13 Apr 2018
Answered: ryohei yanagawa on 22 Apr 2018
%↑のMの値を求めることができるのですが,%↓のsの値は以下のようなエラーが発生してしまい計算することができません.
関数と積分範囲が異なるだけで,同様にプログラムを書いているはずなのですが,どこが原因なのでしょうか?
また,integralとquadの違いを調べたところ,評価がポイントになってくるみたいなのですが,わかりやすくご説明いただけないでしょうか.
editor
clear;
fun1 = @(l,t) (1-2./l./cos(t)).*sin(t);
tm = @(l) acos(2./l);
M = quad2d(fun1,2,4,0,tm)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fun2 = @(x,y) (1-2./(y.*x));
xk = @(y) 2.*y
s = quad2d(fun2,0,5,0,xk)
commandwindo
M =
0.1333
xk =
値をもつ function_handle:
@(y)2.*y
警告: 関数評価 (2000) の最大数に達しました。結果は大域的な誤差のテストをパスしませんでした。
> In quad2d (line 244)
In kesu (line 13)

Accepted Answer

Etsuo Maeda
Etsuo Maeda on 16 Apr 2018
Edited: michio on 16 Apr 2018

> 関数と積分範囲が異なるだけで,同様にプログラムを書いているはずなのですが,どこが原因なのでしょうか?

関数と積分範囲を変えたこと自体が原因です。

エラーと警告は別物ですので、注意する必要があります。

警告はプログラムの実行時に検知された予期せぬ状態、エラーはプログラム内の致命的な問題を表します。

ほとんどの場合、警告は無視することができますが、今回の場合は誤差のテストに失敗していますので、無視することはできません。

> 関数評価 (2000) の最大数に達しました

とありますので、MaxFunEvalsを増やすことで大域的な誤差のテストをパスする可能性があります。

また、FailurePlotをtrueにすることで、どの領域で失敗しているのかが分かります。

合によっては、AbsTolやRelTolの条件を緩和することで解にたどり着きやすくなります。

quad2d の制限 https://jp.mathworks.com/help/matlab/ref/quad2d.html#bu94bxr

>> fun2 = @(x,y) (1-2./(y.*x));

>> xk = @(y) 2.*y;

>> s = quad2d(fun2,0,5,0,xk, 'AbsTol',1e-4, 'RelTol', 1e-4, 'MaxFunEvals', 10000, 'FailurePlot', true)

More Answers (1)

ryohei yanagawa
ryohei yanagawa on 22 Apr 2018
解決致しました.
ご回答ありがとうございました.

Categories

Find more on 数値積分と微分 in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!