10

次の関数を計算するために、MATLABで関数を作成しています。

ここに画像の説明を入力してください

この関数には次のものがあります。

ここに画像の説明を入力してください

これは、関数のmatlabでの私の実装です。

function [b]= exponential(e)
%b = ? 
b= (exp (e) -1)/e;

非常に小さい値で関数をテストすると、実際に関数の制限は1になりますが、数値が非常に小さい場合(たとえば、1 * e-20)、制限はゼロになりますか?この現象の説明は何ですか?私は何か間違ったことをしていますか?

x= 10e-1 , f (x)= 1.0517

x= 10e-5 , f (x)=  1.0000

x= 10e-10 , f (x)=  1.0000

x= 10e-20 , f (x)=  0
4

3 に答える 3

11

問題はそれexp(x)がおよそであるということですが、浮動小数点表現と区別がつかないために1+x評価されています。問題を回避し、小さな引数に対して適切に機能するMATLAB関数(small用に実装されています)があります。111+xexpm1(x)exp(x)-1x

>> x=1e-100;expm1(x)/x
ans =
     1
于 2012-04-04T01:35:03.163 に答える
5

LIMESTツールを試してみる必要がありました。他のアダプティブツールと同様に、だまされる可能性がありますが、通常はかなり優れています。

fun = @(x) (exp(x) - 1)./x;

ご覧のとおり、楽しみはゼロで問題があります。

fun(0)
ans =
   NaN

楽しみをゼロに近いと評価すると、1に近いことがわかります。

format long g
fun(1e-5)
ans =
          1.00000500000696

LIMESTは成功し、限界の誤差推定を提供することさえできます。

[lim,err] = limest(fun,0,'methodorder',3)

lim =
     1

err =
      2.50668568491927e-15

LIMESTは、一連の多項式近似を適応リチャードソンの補外法と組み合わせて使用​​して、限界推定値とその限界の不確実性の測定値の両方を生成します。

では、どのような問題が発生していますか?あなたが見た失敗は単純な減算キャンセルエラーです。したがって、の値を見てください

exp(1e-20)
ans =
     1

フォーマットがlonggの場合でも、exp(1e-20)の倍精度値は1に近すぎるため、1を引くと、結果は正確にゼロになります。これをゼロ以外の値で割ると、ゼロになります。もちろん、xが実際にゼロの場合、0/0の条件があるので、それを試したときにNaNが発生しました。

高精度で何が起こるか見てみましょう。その計算にはHPFツールを使用し、小数点以下64桁で作業します。

DefaultNumberOfDigits 64
exp(hpf('1e-20'))
ans =
1.000000000000000000010000000000000000000050000000000000000000166

1を差し引くと、1と指数値の差はeps(1)未満になるため、MATLABはゼロ値を生成する必要があります。

exp(hpf('1e-20')) - 1
ans =
1.000000000000000000005000000000000000000016666666666670000000000e-20

質問されていないのは、MATLABでその関数を正確に生成する方法を選択する方法です。明らかに、あなたはブルートフォースを使用して、私のように楽しみを定義したくありません。あなたはかなりの正確さを失うからです。おそらく、ゼロ付近の限られた領域でテイラー級数を展開し、ゼロとは大きく異なるxに対して上記のように楽しみを使用します。

于 2012-04-04T01:12:11.220 に答える
-1

それはあなたの数の正確さに関係していると思います。つまり、MATLABのデフォルトの精度は5桁です。で15に拡張できますformat long。MATLABの精度の詳細については、この記事を確認してください

于 2012-04-04T00:51:35.917 に答える