模板:数学分析

时间:2022-03-03 11:15:49

数学分析

二分求零点、三分求极值点

需要 f ( x ) 在区间 [ l , r ] 上单调/凹凸性唯一。

double bs(double l,double r,double f(double x))
{
    if(r-l<EPS)return l;
    double m=(l+r)/2;
    return sgn(f(l)*f(m))<0?bs(l,m,f):ts(m,r,f);
}
double ts(double l,double r,double f(double x))
{
    if(r-l<EPS)return l;
    double d=(r-l)/3,lm=l+d,rm=r-d;
    return f(lm)<f(rm)?ts(l,rm,f):ts(lm,r,f);//极小值
}

积分表

反读可得导数表,此处略。
k d x = k x + C
x a d x = x a + 1 a + 1 + C
1 x d x = ln | x | + C
e x d x = e x + C
a x d x = a x ln a + C
cos x d x = sin x + C
sin x d x = cos x + C
1 c o s 2 x d x = sec 2 x d x = tan x + C
1 s i n 2 x d x = csc 2 x d x = cot x + C
1 1 x 2 d x = arcsin x + C = arccos x + C
1 1 + x 2 d x = arctan x + C = a r c c o t x + C
sec x tan x d x = sec x + C
csc x cot x d x = csc x + C
tan x d x = ln | cos x | + C
cot x d x = ln | sin x | + C
sec x d x = ln | sec x + tan x | + C
csc x d x = ln | csc x cot x | + C
s h x d x = c h x + C
c h x d x = s h x + C
1 x 2 + a 2 d x = 1 a arctan x a + C
1 x 2 a 2 d x = 1 2 a ln | x a x + a | + C
1 a 2 x 2 d x = arcsin x a + C
1 x 2 a 2 d x = ln | x + x 2 a 2 | + C
1 x 2 + a 2 d x = ln | x + x 2 + a 2 | + C

泰勒公式

f ( n ) ( x ) 表示f(x)的n阶导数。
只要让余项<EPS即可计算指定函数到任意精确度。
特别取a=0时称为麦克劳林公式。
f ( x ) = f ( a ) + f ( 1 ) ( a ) ( x a ) + f ( 2 ) ( a ) 2 ! ( x a ) 2 + + f ( n ) ( a ) n ! ( x a ) n + R n ( x )
R n ( x ) = o ( ( x a ) n ) ,佩亚诺余项
R n ( x ) = 1 n ! a x ( x t ) n f ( n + 1 ) ( t ) d t ,积分余项
R n ( x ) = f ( n + 1 ) ( ξ ) ( n + 1 ) ! ( x a ) n + 1 , a < ξ < x ,拉格朗日余项
R n ( x ) = ( x a ) n + 1 n ! ( 1 θ ) n f ( n + 1 ) ( a + θ ( x a ) ) , 0 < θ < 1 ,柯西余项

指数函数

( e x ) ( n ) = e x
e x = 1 + x + x 2 2 ! + x 3 3 ! + + x n n ! + R n ( x )
R n ( x ) = e θ x ( n + 1 ) ! x n + 1 , ξ = θ x , 0 < θ < 1

三角函数

( sin x ) ( n ) = sin ( x + n π 2 )
sin x = x x 3 3 ! + x 5 5 ! x 7 7 ! + + ( 1 ) k 1 x 2 k 1 ( 2 k 1 ) ! + R 2 k ( x )
R 2 k ( x ) = ( 1 ) k cos θ x ( 2 k + 1 ) ! x 2 k + 1
( cos x ) ( n ) = cos ( x + n π 2 )
cos x = 1 x 2 2 ! + x 4 4 ! x 6 6 ! + + ( 1 ) k 1 x 2 k 2 ( 2 k 2 ) ! + R 2 k 1 ( x )
R 2 k 1 ( x ) = ( 1 ) k cos θ x ( 2 k ) ! x 2 k

对数函数

[ ln ( 1 + x ) ] ( n ) = ( 1 ) n 1 ( n 1 ) ! ( 1 + x ) n
ln ( 1 + x ) = x x 2 2 + x 3 3 x 4 4 + + ( 1 ) n 1 x n n + R n ( x )

幂函数

[ ( 1 + x ) a ] ( n ) = a ( a 1 ) ( a n + 1 ) ( 1 + x ) a n
( 1 + x ) a = 1 + a x + a ( a 1 ) 2 ! x 2 + + a ( a 1 ) ( a n + 1 ) n ! x n + R n ( x )

级数

调和级数

n , i = 1 n 1 i ln n + r r 0.5772156649015328

幂级数

i = 1 n i 1 = 1 2 n ( n + 1 )
i = 1 n i 2 = 1 6 n ( n + 1 ) ( 2 n + 1 )
i = 1 n i 3 = 1 4 [ n ( n + 1 ) ] 2
i = 1 n i 4 = 1 30 n ( n + 1 ) ( 2 n + 1 ) ( 3 n 2 + 3 n 1 )
i = 1 n i 5 = 1 12 [ n ( n + 1 ) ] 2 ( 2 n 2 + 2 n 1 )
i = 1 n i 6 = 1 42 n ( n + 1 ) ( 2 n + 1 ) ( 3 n 4 + 6 n 3 3 n + 1 )

插值法

拉格朗日插值法:插值多项式和插值基函数的形式对称,容易编程。但是,增加节点时,需要重新计算每一个插值基函数。要在 ( mod p ) 意义下进行的话,那么p只能是质数。
牛顿插值法:当插值节点增加时,之前已计算的结果仍然能用,每增加一个节点,只要再增加一项即可,从而避免了重复性计算。如果要mod非质数的话,那么就要用牛顿插值法。

typedef complex<double> Coord;
#define X real()
#define Y imag()
double lagrange(const vector<Coord> &p,double x)//返回p确定的多项式函数在x处的值
{
    double ret=0;
    for(int i=0; i<p.size(); ++i)
    {
        double tmp=p[i].Y;
        for(int j=0; j<p.size(); ++j)
            if(i!=j)tmp*=(x-p[j].X)/(p[i].X-p[j].X);
        ret+=tmp;
    }
    return ret;
}
vector<double> lagrange(vector<Coord> p)//返回p确定的多项式系数向量
{
    vector<double> ret(p.size()),sum(p.size());
    ret[0]=p[0].Y,sum[0]=1;
    for(int i=1; i<p.size(); ++i)
    {
        for(int j=p.size()-1; j>=i; --j)
            p[j].Y=(p[j].Y-p[j-1].Y)/(p[j].X-p[j-i].X);
        for(int j=i; ~j; --j)
            sum[j]=(j?sum[j-1]:0)-sum[j]*p[i-1].X,
                   ret[j]+=sum[j]*p[i].Y;
    }
    return ret;
}
double DifferenceQuotient(const vector<Coord> &p,int k)//计算差商
{
    double ret=0;
    for(int i=0; i<=k; ++i)
    {
        double tmp=p[i].Y;
        for(int j=0; j<=k; ++j)
            if(i!=j)tmp/=p[i].X-p[j].X;
        ret+=tmp;
    }
    return ret;
}
double newton(const vector<Coord> &p,double x)
{
    double ret=p[0].Y;
    for(int i=1; i<p.size(); ++i)
    {
        double tmp=DifferenceQuotient(p,i);//多次求,可O(n^3)预处理优化
        for(int j=0; j<i; ++j)tmp*=x-p[j].X;
        ret+=tmp;
    }
    return ret;
}