Algebra 当mu*t非常小时1-exp(-mu*t)的近似值
我正在进行一些相当简单的线性衰减和吸收计算,从高中数学中我似乎记得有一个近似值: 1-exp(-mu*t) 什么时候 mu*tmu*t+O((mu*t)^2)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
要了解原因,请尝试将其重写为
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;
}
对于所有正的xmu*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
...