Algebra 当mu*t非常小时1-exp(-mu*t)的近似值

Algebra 当mu*t非常小时1-exp(-mu*t)的近似值,algebra,approximation,Algebra,Approximation,我正在进行一些相当简单的线性衰减和吸收计算,从高中数学中我似乎记得有一个近似值: 1-exp(-mu*t) 什么时候 mu*tmu*t+O((mu*t)^2) 要了解原因,请尝试将其重写为f(u)=1-exp(-u),并在u=0点进行扩展,例如,如果您使用的是C++11,它将此函数作为标准库的一部分: 在您的例子中,您可以将其称为-expm1(-mu*t) 否则,只需删除第一个1,就可以轻松地从exp(x)的Maclaurin系列派生出expm1的Maclaurin系列。下面的expm1\u m

我正在进行一些相当简单的线性衰减和吸收计算,从高中数学中我似乎记得有一个近似值:

1-exp(-mu*t)

什么时候

mu*tmu*t+O((mu*t)^2)


要了解原因,请尝试将其重写为
f(u)=1-exp(-u)
,并在
u=0
点进行扩展,例如,如果您使用的是C++11,它将此函数作为标准库的一部分:

在您的例子中,您可以将其称为
-expm1(-mu*t)

否则,只需删除第一个1,就可以轻松地从
exp(x)
的Maclaurin系列派生出
expm1的Maclaurin系列。下面的
expm1\u maclaurin
中给出了一个实现

将其与内置的expm1进行比较:

#include <cmath>
#include <iostream>
#include <limits>
using namespace std;

double expm1_maclaurin( double x )
{
    const double order = 10;
    double retval = 1.0;
    for( int i = order ; 1 < i ; --i ) retval = 1.0 + x*retval/i;
    return x*retval;
}

int main()
{
    cout.precision(numeric_limits<double>::digits10);
    for( int i = 0 ; i <= 32 ; ++i )
    {
        double x = i < 0 ? 1.0 * (1u<<-i) : i < 32 ? 1.0 / (1u<<i) : 0;
        cout << "x=" << x << ' '
             << expm1(x) << ' '
             << expm1_maclaurin(x) << ' '
             << ( expm1(x) == expm1_maclaurin(x) ) << endl;
    }
    return 0;
}

对于所有正的
x
mu*t
,或
mu*t-(mu*t)^2/2
。有关更好的近似值,请参见我的答案。
x=1 1.71828182845905 1.71828180114638 0
x=0.5 0.648721270700128 0.648721270687366 0
x=0.25 0.284025416687742 0.284025416687735 0
x=0.125 0.133148453066826 0.133148453066826 1
x=0.0625 0.0644944589178594 0.0644944589178594 1
x=0.03125 0.0317434074991027 0.0317434074991027 1
...