構造系數矩陣,高斯消元求解二次函數,然後兩點式求直線函數,帶入辛普森積分法無腦AC。。。
#include#include #include #include #include #include using namespace std; struct node { double x,y; }p[4]; double g[10][10]; double f1(double x) //二次函數 { return g[0][3]*x*x+g[1][3]*x+g[2][3]; } double f2(double x) //直線兩點式 { double y2=p[2].y,x2=p[2].x; double y1=p[1].y,x1=p[1].x; return (x-x1)/(x2-x1)*(y2-y1)+y1; } double f(double x) { return f1(x)-f2(x); } double simpson(double a,double b,int n) { double h=(b-a)/n; double ans=f(a)+f(b); for(int i=1;i big) { big = fabs(g[j][i]); k = j; } } if (k != i) { for (j = 0; j <= cnt; j++) swap(g[i][j], g[k][j]); } for (j = i + 1; j < cnt; j++) { if (g[j][i]) { tmp = -g[j][i] / g[i][i]; for (k = i; k <= cnt; k++) g[j][k] += tmp * g[i][k]; } } } for (i = cnt - 1; i >= 0; i--) { for (j = i + 1; j < cnt; j++) g[i][cnt]-=g[j][cnt]*g[i][j]; g[i][cnt]/=g[i][i]; } } int main() { int cas; scanf("%d",&cas); while(cas--) { for(int i=0;i<3;i++) scanf("%lf%lf",&p[i].x,&p[i].y); for(int i=0;i<3;i++) { g[i][0]=p[i].x*p[i].x; //ax^2 g[i][1]=p[i].x; //bx g[i][2]=1; //c g[i][3]=p[i].y; //y } Gauss(3); // printf("%lfx^2+%lfx+%lf\n",g[0][3],g[1][3],g[2][3]); printf("%.2lf\n",simpson(p[1].x,p[2].x,1000)); } return 0; }