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

13 次查看(过去 30 天)
ryohei yanagawa
ryohei yanagawa 2018-4-13
%↑の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!