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

15 visualizaciones (últimos 30 días)
ryohei yanagawa
ryohei yanagawa el 13 de Abr. de 2018
Respondida: ryohei yanagawa el 22 de Abr. de 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)

Respuesta aceptada

Etsuo Maeda
Etsuo Maeda el 16 de Abr. de 2018
Editada: michio el 16 de Abr. de 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)

Más respuestas (1)

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

Categorías

Más información sobre 数値積分と微分 en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!