自适应Simpson法与积分初步

前言

不知道为什么,今天感觉想要写一下数学的东西,然后就看了一下我还有这个模板不会,顺手写了一下。

没有学过微积分的最好还是看一下求导为好。

求导

听说很多人都不会求导,我写一下吧qwq

\(f(x)=ax^2+bx+c\)

那么显然这个东西求导的话就是:

\(f'(x)=\frac{\triangle{y}}{\triangle{x}}\)

那么\(\triangle{y}=f(x+\triangle{x})-f(x)\)

你把这个东西拆开:

\[\triangle{y}= \\ f(x+\triangle{x})-f(x) \\ =a*(x+\triangle{x})^2-a*x^2+b*(x+\triangle{x})-b*x+c-c \\ =a*(x^2+\triangle{x}^2+2*x*\triangle{x})-a*x^2+b*x-b*x+b*\triangle{x} \\ =a*\triangle{x}^2+2*a*x*\triangle{x}+b*\triangle{x} \]

然后考虑一下除一下就是:

\[f'(x)=\frac{\triangle{y}}{\triangle{x}} \\ =\frac{a*\triangle{x}^2+2*a*x*\triangle{x}+b*\triangle{x}}{\triangle{x}} \\ =a\triangle{x}+2*a*x+b \]

然后我们又发现\(lim_{\triangle{x}->0}\triangle{x}\)

所以化简就是:

\(f'(x)=2*a*x+b\)

由此我们还可以得到一些比较好的东西:

\((x^n)'=n*x^{n-1}\)

与:

\((g(x)*f(x))'=g(x)\centerdot f'(x)+g'(x)\centerdot f(x)\)

然后把两个搞在一起就是:

\[(c*f(x))'=c*f'(x) \]

大概入门就只要这么点东西吧。

积分

定义就是曲面围成的面积。

然后就是许多的式子qwq(这个直接背记就好了。)

当然如果有网的话也可以查。

还有一个比较需要记住的公式:

可导函数\(f(x)\)在区间\([a,b]\)的弧长

\(\int_a^b\sqrt{1+f'(x)}dx\)

我突然发现我自己越来越不会算区间,凉凉了。

开始

假定我们现在已经有了一个函数\(f(x)\),现在要求这样子的积分:

\[\int_a^bf(x)dx \]

Simpson公式

\[\int_a^bf(x)dx\approx\frac{\triangle{x}}{3}(y_0+4*y_1+y_2)+\frac{\triangle{x}}{3}(y_2+4*y_3+y_4)+... \]

然后直接自适应Simpson法套进去就好了.

然后?
没有了qwq

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
    int f=1,sum=0;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return f*sum;
}
const double eps=1e-12;
double a,b,c,d,l,r;
double F(double x){
    return (c*x+d)/(a*x+b);
}
double Simpson(double a,double b){
    double c=a+(b-a)/2;
    return (F(a)+4*F(c)+F(b))*(b-a)/6;
}
double simpson(double a,double b,double eps,double A){
    double c=a+(b-a)/2;
    double L=Simpson(a,c),R=Simpson(c,b);
    if(fabs(L+R-A)<=eps*15)return L+R+(L+R-A)/15;
    return simpson(a,c,eps/2,L)+simpson(c,b,eps/2,R);
}
double Ask(double a,double b,double eps){
    return simpson(a,b,eps,Simpson(a,b));
}
int main(){
    scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&l,&r);
    printf("%.6lf\n",Ask(l,r,eps));
    return 0;
}
posted @ 2019-01-14 09:38  QwQGJH  阅读(323)  评论(0编辑  收藏  举报