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

조회 수: 8 (최근 30일)
ryohei yanagawa
ryohei yanagawa 2018년 4월 13일
답변: ryohei yanagawa 2018년 4월 22일
%↑の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)

채택된 답변

Etsuo Maeda
Etsuo Maeda 2018년 4월 16일
편집: michio 2018년 4월 16일

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

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

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

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

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

> 関数評価 (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)

추가 답변 (1개)

ryohei yanagawa
ryohei yanagawa 2018년 4월 22일
解決致しました.
ご回答ありがとうございました.

카테고리

Help CenterFile Exchange에서 数値積分と微分에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!