最小二乘法一阶线性拟合二阶曲线拟合的C语言程序实现_百

合集下载

最小二乘法曲线拟合C语言实现

最小二乘法曲线拟合C语言实现

最小二乘法曲线拟合C语言实现简单思路如下:1,采用目标函数对多项式系数求偏导,得到最优值条件,组成一个方程组;2,方程组的解法采用行列式变换(两次变换:普通行列式——三角行列式——对角行列式——求解),行列式的求解算法上优化过一次了,目前还没有更好的思路再优化运算方法,限幅和精度准备再修改修改目前存在的问题:1,代码还是太粗糙2,数学原理可行,但是计算机运算有幅度溢出和精度问题,这方面欠考虑,导致高阶大数据可能拟合失败下面附简单注释版代码:#include "stdafx.h"#include "stdlib.h"#include "math.h"//把二维的数组与一维数组的转换,也可以直接用二维数组,只是我的习惯是不用二维数组#define ParaBuffer(Buffer,Row,Col) (*(Buffer + (Row) * (SizeSrc + 1) + (Col)))///************************************************************** *********************从txt文件里读取double型的X,Y数据txt文件里的存储格式为X1 Y1X2 Y2X3 Y3X4 Y4X5 Y5X6 Y6X7 Y7X8 Y8函数返回X,Y,以及数据的数目(以组为单位)*************************************************************** ********************/static int GetXY(const char* FileName, double* X, double* Y, int* Amount){FILE* File = fopen(FileName, "r");if (!File)return -1;for (*Amount = 0; !feof(File); X++, Y++, (*Amount)++)if (2 != fscanf(File, (const char*)"%lf %lf", X, Y))break;fclose(File);return 0;}/************************************************************** *********************打印系数矩阵,只用于调试,不具备运算功能对于一个N阶拟合,它的系数矩阵大小是(N + 1)行(N + 2)列double* Para:系数矩阵存储地址int SizeSrc:系数矩阵大小(SizeSrc)行(SizeSrc + 1)列***********************************************************************************/static int PrintPara(double* Para, int SizeSrc){int i, j;for (i = 0; i < SizeSrc; i++){for (j = 0; j <= SizeSrc; j++)printf("%10.6lf ", ParaBuffer(Para, i, j));printf("\r\n");}printf("\r\n");return 0;}/************************************************************** *********************系数矩阵的限幅处理,防止它溢出,目前这个函数很不完善,并不能很好地解决这个问题原理:矩阵解行列式,同一行乘以一个系数,行列式的解不变当然,相对溢出问题,还有一个精度问题,也是同样的思路,现在对于这两块的处理很不完善,有待优化以行为单位处理*************************************************************** ********************/static int ParalimitRow(double* Para, int SizeSrc, int Row){int i;double Max, Min, Temp;for (Max = abs(ParaBuffer(Para, Row, 0)), Min = Max, i = SizeSrc; i; i--){Temp = abs(ParaBuffer(Para, Row, i));if (Max < Temp)Max = Temp;if (Min > Temp)Min = Temp;}Max = (Max + Min) * 0.000005;for (i = SizeSrc; i >= 0; i--)ParaBuffer(Para, Row, i) /= Max;return 0;}/************************************************************** *********************同上,以矩阵为单位处理*************************************************************** ********************/static int Paralimit(double* Para, int SizeSrc){int i;for (i = 0; i < SizeSrc; i++)if (ParalimitRow(Para, SizeSrc, i))return -1;return 0;}/************************************************************** *********************系数矩阵行列式变换*************************************************************** ********************/static int ParaPreDealA(double* Para, int SizeSrc, int Size){int i, j;for (Size -= 1, i = 0; i < Size; i++){for (j = 0; j < Size; j++)ParaBuffer(Para, i, j) = ParaBuffer(Para, i, j) * ParaBuffer(Para, Size, Size) - ParaBuffer(Para, Size, j) * ParaBuffer(Para, i, Size);ParaBuffer(Para, i, SizeSrc) = ParaBuffer(Para, i, SizeSrc) * ParaBuffer(Para, Size, Size) - ParaBuffer(Para, Size, SizeSrc) * ParaBuffer(Para, i, Size);ParaBuffer(Para, i, Size) = 0;ParalimitRow(Para, SizeSrc, i);}return 0;}/************************************************************** *********************系数矩阵行列式变换,与ParaPreDealA配合完成第一次变换,变换成三角矩阵*************************************************************** ********************/static int ParaDealA(double* Para, int SizeSrc){int i;for (i = SizeSrc; i; i--)if (ParaPreDealA(Para, SizeSrc, i))return -1;return 0;}/************************************************************** *********************系数矩阵行列式变换*************************************************************** ********************/static int ParaPreDealB(double* Para, int SizeSrc, int OffSet) {int i, j;for (i = OffSet + 1; i < SizeSrc; i++){for (j = OffSet + 1; j <= i; j++)ParaBuffer(Para, i, j) *= ParaBuffer(Para, OffSet, OffSet);ParaBuffer(Para, i, SizeSrc) = ParaBuffer(Para, i, SizeSrc) * ParaBuffer(Para, OffSet, OffSet) - ParaBuffer(Para, i, OffSet) * ParaBuffer(Para, OffSet, SizeSrc);ParaBuffer(Para, i, OffSet) = 0;ParalimitRow(Para, SizeSrc, i);}return 0;}/************************************************************** *********************系数矩阵行列式变换,与ParaPreDealB配合完成第一次变换,变换成对角矩阵,变换完毕***********************************************************************************/static int ParaDealB(double* Para, int SizeSrc){int i;for (i = 0; i < SizeSrc; i++)if (ParaPreDealB(Para, SizeSrc, i))return -1;for (i = 0; i < SizeSrc; i++){if (ParaBuffer(Para, i, i)){ParaBuffer(Para, i, SizeSrc) /= ParaBuffer(Para, i, i);ParaBuffer(Para, i, i) = 1.0;}}return 0;}/************************************************************** *********************系数矩阵变换*************************************************************** ********************/static int ParaDeal(double* Para, int SizeSrc){PrintPara(Para, SizeSrc);Paralimit(Para, SizeSrc);PrintPara(Para, SizeSrc);if (ParaDealA(Para, SizeSrc))return -1;PrintPara(Para, SizeSrc);if (ParaDealB(Para, SizeSrc))return -1;return 0;}/************************************************************** *********************最小二乘法的第一步就是从XY数据里面获取系数矩阵double* Para:系数矩阵地址const double* X:X数据地址const double* Y:Y数据地址int Amount:XY数据组数int SizeSrc:系数矩阵大小(SizeSrc)行(SizeSrc + 1)列*************************************************************** ********************/static int GetParaBuffer(double* Para, const double* X, const double* Y, int Amount, int SizeSrc){int i, j;for (i = 0; i < SizeSrc; i++)for (ParaBuffer(Para, 0, i) = 0, j = 0; j < Amount; j++)ParaBuffer(Para, 0, i) += pow(*(X + j), 2 * (SizeSrc - 1) - i);for (i = 1; i < SizeSrc; i++)for (ParaBuffer(Para, i, SizeSrc - 1) = 0, j = 0; j < Amount; j++) ParaBuffer(Para, i, SizeSrc - 1) += pow(*(X + j), SizeSrc - 1 - i);for (i = 0; i < SizeSrc; i++)for (ParaBuffer(Para, i, SizeSrc) = 0, j = 0; j < Amount; j++)ParaBuffer(Para, i, SizeSrc) += (*(Y + j)) * pow(*(X + j), SizeSrc - 1 - i);for (i = 1; i < SizeSrc; i++)for (j = 0; j < SizeSrc - 1; j++)ParaBuffer(Para, i, j) = ParaBuffer(Para, i - 1, j + 1);return 0;}/************************************************************** *********************整个计算过程*************************************************************** ********************/int Cal(const double* BufferX, const double* BufferY, int Amount, int SizeSrc, double* ParaResK){double* ParaK = (double*)malloc(SizeSrc * (SizeSrc + 1) * sizeof(double));GetParaBuffer(ParaK, BufferX, BufferY, Amount, SizeSrc);ParaDeal(ParaK, SizeSrc);for (Amount = 0; Amount < SizeSrc; Amount++, ParaResK++) *ParaResK = ParaBuffer(ParaK, Amount, SizeSrc);free(ParaK);return 0;}/************************************************************** *********************测试main函数数据组数:20阶数:5***********************************************************************************/int main(int argc, char* argv[]){//数据组数int Amount;//XY缓存,系数矩阵缓存double BufferX[1024], BufferY[1024], ParaK[6];if (GetXY((const char*)"test.txt", (double*)BufferX, (double*)BufferY, &Amount))return 0;//运算Cal((const double*)BufferX, (const double*)BufferY, Amount, sizeof(ParaK) / sizeof(double), (double*)ParaK);//输出系数for (Amount = 0; Amount < sizeof(ParaK) / sizeof(double); Amount++)printf("ParaK[%d] = %lf!\r\n", Amount, ParaK[Amount]);//屏幕暂留system("pause");return 0;}。

c语言 曲线拟合

c语言 曲线拟合

c语言曲线拟合曲线拟合(Curve Fitting)是数据处理的常用方法之一,其基本思想是通过已知的一组数据点,找到一条曲线,使得这条曲线尽可能地接近这些数据点。

在C语言中,可以使用最小二乘法进行曲线拟合。

以下是一个简单的C语言代码示例,用于实现二次多项式拟合:```c#include<stdio.h>#include<math.h>#define N5//数据点个数int main(){double x[N]={1,2,3,4,5};//自变量数据点double y[N]={2.2,2.8,3.6,4.5,5.1};//因变量数据点double a[3]={0,0,0};//二次多项式系数,初始化为0double sum=0,sumx=0,sumx2=0,sumxy= 0;int i;for(i=0;i<N;i++){sum+=y[i];sumx+=x[i];sumx2+=x[i]*x[i];sumxy+=x[i]*y[i];}double mean_y=sum/N;//计算y的平均值double mean_x=sumx/N;//计算x的平均值//计算二次多项式系数a[0]=(N*sumxy-sumx*sumy)/(N*sumx2 -sumx*sumx);a[1]=(mean_y-a[0]*mean_x)/N;a[2]=mean_y-a[0]*mean_x-a[1];printf("拟合曲线为:y=%.2fx^2+%.2fx+%.2f\n", a[0],a[1],a[2]);return0;}```在这个示例中,我们首先定义了5个数据点,然后使用最小二乘法计算了二次多项式的系数。

最后,我们输出了拟合曲线的公式。

C++程序,最小二乘,二次函数 拟合

C++程序,最小二乘,二次函数 拟合

最小二乘二次函数形式拟合C++程序#include <iostream.h>#include <math.h>#define max_n 25 //(x_i,y_i)的最大维数typedef struct tagpoint //点的结构{double x;double y;} point;int main(){int m;int i;point points[max_n];static double a11,a12,a13,a21,a22,a23,a31,a32,a33,c1,c2,c3; double A,B,C,tmp;cout<<"请在0到25之间选择输入m的值:"<<endl;//输入点 m cin>>m;if(m>max_n){cout<<"这个值太大,大于25,请重新输入"<<endl;return 1;}if(m<0){cout<<"这个值太小,小于0,请重新输入"<<endl;return 1;}cout<<"现在输入(x_i,y_i),i=1,..."<<m<<endl;//输入点for(i=1;i<=m;i++){cin>>tmp;points[i].x=tmp;cin>>tmp;points[i].y=tmp;}//输入 points[i].x与points[i].yfor(i=1;i<=m;i++){ //其中为对原方程取对数后的a12+=points[i].x;a13+=points[i].x*points[i].x;a23+=points[i].x*points[i].x*points[i].x;a33+=points[i].x*points[i].x*points[i].x*points[i].x;c1+=points[i].y;c2+=points[i].x*points[i].y;c3+=points[i].x*points[i].x*points[i].y;}a11=m;a21=a12;a22=a13;a31=a13;a32=a23; //求解A=c1*(a22*a33-a23*a32)/(a11*a22*a33-a11*a23*a32-a21*a12*a33+a21*a13*a 32+a31*a12*a23-a31*a13*a22)-c2*(a12*a33-a13*a32)/(a11*a22*a33-a11*a23 *a32-a21*a12*a33+a21*a13*a32+a31*a12*a23-a31*a13*a22)+c3*(a12*a23-a13 *a22)/(a11*a22*a33-a11*a23*a32-a21*a12*a33+a21*a13*a32+a31*a12*a23-a3 1*a13*a22);B=-c1*(a21*a33-a23*a31)/(a11*a22*a33-a11*a23*a32-a21*a12*a33+a21*a13* a32+a31*a12*a23-a31*a13*a22)+c2*(a11*a33-a13*a31)/(a11*a22*a33-a11*a2 3*a32-a21*a12*a33+a21*a13*a32+a31*a12*a23-a31*a13*a22)-c3*(a11*a23-a1 3*a21)/(a11*a22*a33-a11*a23*a32-a21*a12*a33+a21*a13*a32+a31*a12*a23-a 31*a13*a22);C=c1*(a21*a32-a22*a31)/(a11*a22*a33-a11*a23*a32-a21*a12*a33+a21*a13*a 32+a31*a12*a23-a31*a13*a22)-c2*(a11*a32-a12*a31)/(a11*a22*a33-a11*a23 *a32-a21*a12*a33+a21*a13*a32+a31*a12*a23-a31*a13*a22)+c3*(a11*a22-a12 *a21)/(a11*a22*a33-a11*a23*a32-a21*a12*a33+a21*a13*a32+a31*a12*a23-a3 1*a13*a22);cout<<"所得拟合函数为;"<<endl;cout<<"p(x)="<<A<<B<<"x"<<C<<"x^2"<<endl;//输出return 0;}。

用C语言实现的曲线拟合的最小二乘法

用C语言实现的曲线拟合的最小二乘法

实验名称:曲线拟合的最小二乘法 实验目的了解曲线拟合的最小二乘法实验类型设计型实验环境Windows XP TC实验内容相关知识:已知C [a,b ]中函数f (x )的一组实验数据(x i ,y i )(i=0,1,…,m),其中y i =f (x i )。

设);,,1,0)((m n n j x j <= ϕ是C [a ,b]上线性无关函数族。

在)}(,),(),({10x x x span n ϕϕϕφ =中找函数f(x) 曲线拟合的最小二乘解∑==nj j j x a x S 0*)()(ϕ,其法方程(组)为:),,1,0(),(0n k d a nj k j j k==∑=ϕϕ其中,∑==mi i k i j i k j x x x 0)()()(),(ϕϕωϕϕ∑=≡=mi k i k i i k d x x f x f 0)()()(),(ϕωϕ k=0,1,…,n特别是,求函数f(x ) 曲线拟合的线性最小二乘解b ax x S +=)(*的计算公式为:∑∑∑∑∑∑======-+-=mi i m i i mi i i mi i mi i mi i x x m y x x y x b 02202)()1())(())((∑∑∑∑∑=====-+-+=mi i m i i mi i m i i m i i i x x m y x y x m a 0220)()1())(()1(数据结构:两个一维数组或一个二维数组 算法设计:(略)实验用例: 已知函数y=f (x)的一张表:处的近似值,并画出实验数据和直线。

编写代码:#include〈stdio.h>#include<stdlib.h>#include<graphics.h〉double qiuhe1(double a[10][2],int p){int i;double y;y=0;for(i=0;i〈10;i++)y=y+a[i][p];return y;}double qiuhe2(double a[10][2],int p){int i;double y=0;for(i=0;i<10;i++)y=y+a[i][0]*a[i][p];return y;}double nihe(double a[10][2],double x){double a1,b,y;a1=(10*qiuhe2(a,1)-qiuhe1(a,0)*qiuhe1(a,1))/(10*qiuhe2(a,0)-qiuhe1(a,0)*qiuhe1(a,0));b=(qiuhe2(a,0)*qiuhe1(a,1)—qiuhe1(a,0)*qiuhe2(a,1))/(10*qiuhe2(a,0)—qiuhe1(a,0)*qiuhe1(a,0));y=a1*x+b;return y;}int main(){double a[10][2]={0,68,10,67.1,20,66.4,30,65.6,40,64.6,50,61.8, 60,61.0,70,60.8,80,60.4,90,60};double x,x1,q=1;c har c[12];i nt i;long n;int arw[6]={515,235,520,240,515,245};int arw1[6]={315,45,320,40,325,45};int gdriver=IBM8514;int gmode=IBM8514HI;initgraph(&gdriver, &gmode, ”c:\\TC20\\BGI");cleardevice();printf(”input x:\n");scanf("%lf",&x);printf("%f\n",nihe(a,x));n=nihe(a,x)*1000000+1;c[0]='y’;c[1]=’=';c[4]='。

C语言最小二乘法

C语言最小二乘法

函数逼近与曲线拟合,用最小二乘法进行曲线拟合的C或C++编写的完整程序!已知x 0 5 10 15 20 25 30 35 40 45 50 55y 0 1.27 2.16 2.86 3.44 3.87 4.15 4.37 4.51 4.58 4.02 4.64近似解析表达式为y=at+bt^2+ct^3求a,b,c曲线拟合:#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <math.h>Smooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double*dt3);void main(){int i ,n ,m ;double *x,*y,*a,dt1,dt2,dt3,b;n = 12;// 12个样点m = 4; //3次多项式拟合b = 0; //x的初值为0/*分别为x,y,a分配存贮空间*/x = (double *)calloc(n,sizeof(double));if(x == NULL){printf("内存分配失败\n");exit (0);}y = (double *)calloc(n,sizeof(double));if(y == NULL){printf("内存分配失败\n");exit (0);}a = (double *)calloc(n,sizeof(double));if(a == NULL){printf("内存分配失败\n");exit (0);}for(i=1;i<=n;i++){x[i-1]=b+(i-1)*5;/*每隔5取一个点,这样连续取12个点*/}y[0]=0;y[1]=1.27;y[2]=2.16;y[3]=2.86;y[4]=3.44;y[5]=3.87;y[6]=4.15;y[7]=4.37;y[8]=4.51;y[9]=4.58;y[10]=4.02;y[11]=4.64;/*x[i-1]点对应的y值是拟合已知值*/Smooth(x,y,a,n,m,&dt1,&dt2,&dt3); /*调用拟合函数*/for(i=1;i<=m;i++)printf("a[%d] = %.10f\n",(i-1),a[i-1]);printf("拟合多项式与数据点偏差的平方和为:\n");printf("%.10e\n",dt1);printf("拟合多项式与数据点偏差的绝对值之和为:\n");printf("%.10e\n",dt2);printf("拟合多项式与数据点偏差的绝对值最大值为:\n");printf("%.10e\n",dt3);free(x); /*释放存储空间*/free(y); /*释放存储空间*/free(a); /*释放存储空间*/}Smooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double*dt3)//(x,y,a,n,m,dt1,dt2,dt3 )//double *x; /*实型一维数组,输入参数,存放节点的xi值*///double *y; /*实型一维数组,输入参数,存放节点的yi值*///double *a; /*双精度实型一维数组,长度为m。

最小二乘法拟合原理及代码的实现

最小二乘法拟合原理及代码的实现

最小二乘法拟合原理及代码的实现最小二乘法(Least Squares Method)是一种常用的统计分析方法,用于拟合数学模型和找到数据间的最佳逼近曲线。

其核心原理是通过最小化观测值与预测值之间的误差平方和来确定模型的参数。

在本文中,我将介绍最小二乘法的基本原理,并提供一个简单的Python代码实现。

最小二乘法的基本原理是基于以下假设:观测值与预测值之间的误差是服从均值为零的正态分布。

这意味着误差有一个平均值为零的正态分布,并且其方差是常数。

基于这一假设,我们可以使用误差的平方和来评估模型的拟合度,并通过最小化这个平方和来确定模型的参数。

假设我们有一组观测数据,表示为(x1, y1), (x2, y2), ..., (xn, yn),我们希望找到一个最佳拟合曲线,使得这些数据点到曲线的垂直距离的平方和最小。

这个最佳拟合曲线可以表示为一个函数,例如y =f(x)。

最小二乘法通过最小化误差平方和来确定函数f(x)的参数。

min Σ(yi - f(xi))²其中,Σ表示求和符号,yi表示观测值,f(xi)表示预测值。

为了实现最小二乘法的拟合,我们需要选择一个适当的拟合函数f(x)。

这个函数可以是线性的、多项式的、指数的或者其他类型的函数。

具体选择取决于实际的数据和拟合需求。

下面是一个简单的Python代码实现最小二乘法拟合的示例:```pythonimport numpy as npfrom scipy.optimize import curve_fit#定义拟合函数,例如线性函数def linear_func(x, a, b):return a * x + b#生成模拟数据x = np.linspace(0, 10, 100)y = 2 * x + 1 + np.random.randn(100)#使用最小二乘法进行拟合params, _ = curve_fit(linear_func, x, y)#输出拟合参数a, b = paramsprint("拟合参数:a = {}, b = {}".format(a, b))```在这个示例中,我们使用线性函数y = a*x + b来拟合数据。

最小二乘法 c语言

最小二乘法 c语言

最小二乘法 c语言最小二乘法是一种常用的数学方法,用于通过已知数据点拟合出一条最佳拟合曲线。

在本文中,我们将讨论如何使用C语言实现最小二乘法。

我们需要明确最小二乘法的基本原理。

最小二乘法的目标是找到一条曲线,使得该曲线上的点到已知数据点的距离之和最小。

具体地,我们假设已知数据点的集合为{(x1, y1), (x2, y2), ..., (xn, yn)},我们需要找到一条曲线y = f(x),使得f(xi)与yi的差的平方和最小。

那么,如何在C语言中实现最小二乘法呢?首先,我们需要定义一个函数来计算拟合曲线上的点f(xi)。

在这个函数中,我们可以使用多项式的形式来表示拟合曲线。

例如,我们可以选择使用一次多项式y = ax + b来拟合数据。

然后,我们可以使用最小二乘法的公式来计算出最优的a和b的值。

接下来,我们需要编写一个函数来计算拟合曲线上每个点f(xi)与已知数据点yi的差的平方和。

通过遍历已知数据点的集合,并计算每个点的差的平方,最后将所有差的平方求和,即可得到拟合曲线的误差。

然后,我们可以使用梯度下降法来最小化误差函数。

梯度下降法是一种优化算法,通过不断迭代来找到误差函数的最小值。

在每次迭代中,我们通过计算误差函数对参数a和b的偏导数,来更新a和b的值。

通过多次迭代,最终可以找到最优的a和b的值,从而得到最佳拟合曲线。

我们可以编写一个主函数来调用以上的函数,并将最终的拟合曲线绘制出来。

在这个主函数中,我们可以读取已知数据点的集合,并调用最小二乘法函数来计算拟合曲线的参数。

然后,我们可以使用绘图库来绘制已知数据点和拟合曲线,并将结果输出到屏幕上。

通过以上的步骤,我们就可以使用C语言实现最小二乘法了。

当然,在实际应用中,我们可能会遇到更复杂的数据和更高阶的多项式拟合。

但是基本的原理和方法是相同的,只是需要做一些适当的调整。

总结一下,最小二乘法是一种常用的数学方法,用于通过已知数据点拟合出一条最佳拟合曲线。

最小二乘法C语言编程

最小二乘法C语言编程
最小二乘法c语言编程最小二乘法c语言程序c语言最小二乘法最小二乘法c语言代码c语言编程九九乘法表最小二乘法最小二乘法公式最小二乘法曲线拟合最小二乘法原理偏最小二乘法
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
x2=x*x*x*x;
x3+=x2;
}
*(pp++)=x3;
}
}
pp=*(b+1);
p=a9;
ppp=a8;
x3=0;
for(i=0;i<10;i++) {
x=*(p++);
x2=*(ppp++);
x3+=x*x2;
}
*pp=x3;
pp=*(b+2);
p=a9;
ppp=a8;
x3=0;
for(i=0;i<10;i++) {
*(p++)=(x1*x5-x2*x4);
p=*(b1+0);
pp=*(b4+0);
for (i=0;i<3;i++) {
for(j=0;j<3;j++){
x1=*(p++);
x=x1*c;
*(pp++)=x;
}
}
//////////////////////////求两矩阵的商//////////////////////////////////////
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档