曲线拟合C语言程序
c语言 高斯曲线拟合

c语言高斯曲线拟合摘要:1.高斯曲线简介2.数据准备与处理3.C语言实现高斯曲线拟合4.代码解析与优化5.结论与展望正文:**1.高斯曲线简介**高斯曲线,又称高斯分布,是一种在自然界和工程领域中广泛应用的概率分布曲线。
它的形状呈钟型,表示随机变量在某一区间内的取值概率。
高斯曲线具有两个重要的参数:均值(μ)和标准差(σ)。
在实际应用中,通过高斯曲线拟合数据,可以更好地了解数据的分布特征,为后续的分析和处理提供依据。
**2.数据准备与处理**为了演示高斯曲线的拟合过程,我们首先需要准备一组数据。
这里,我们假设已经获得了一组样本数据,如下所示:```x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]y = [23, 27, 32, 36, 39, 42, 45, 48, 51, 54]```接下来,我们需要对数据进行预处理,包括去除异常值、平滑数据等。
这里我们仅进行简单的平滑处理,以减小噪声对曲线拟合的影响。
**3.C语言实现高斯曲线拟合**在C语言中,我们可以利用数值积分方法求解高斯曲线的拟合方程。
这里,我们采用Legendre多项式展开法,通过计算多项式系数,进而得到高斯曲线的参数。
以下是C语言实现高斯曲线拟合的代码:```c#include <stdio.h>#include <math.h>void gaussian_fit(double *x, double *y, int n) {// 计算Legendre多项式系数double coef[n];for (int i = 0; i < n; i++) {coef[i] = 1.0;}// 迭代计算系数for (int i = 1; i < n; i++) {double sum = 0.0;for (int j = 0; j < n; j++) {sum += coef[j] * pow(x[i] - x[j], 2);}coef[i] = sqrt(6.0 / (i * (i + 1) * (2 * i + 1)));}// 计算均值和标准差double mean = 0.0;double std_dev = 0.0;for (int i = 0; i < n; i++) {mean += y[i] * coef[i];std_dev += (y[i] - mean) * coef[i];}mean /= n;std_dev /= n;// 输出结果printf("Mean: %lf", mean);printf("Standard deviation: %lf", std_dev);}int main() {double x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};double y[] = {23, 27, 32, 36, 39, 42, 45, 48, 51, 54};int n = sizeof(x) / sizeof(x[0]);gaussian_fit(x, y, n);return 0;}```**4.代码解析与优化**在上述代码中,我们实现了高斯曲线拟合的核心算法。
5阶多项式曲线拟合 c语言实现

1. 概述在实际工程和科学问题中,经常需要拟合数据并用数学模型来描述数据的规律。
多项式曲线拟合是一种常用的数学工具,通过拟合多项式曲线可以找出数据的规律,并用曲线模型来预测和分析数据。
2. 多项式曲线拟合的基本原理多项式曲线拟合是通过拟合一个多项式函数来逼近已知的数据点。
假设有n个已知的数据点(x1, y1), (x2, y2), ..., (xn, yn),我们要找出一个n次多项式函数y = a0 + a1x + a2x^2 + ... + anx^n来逼近这些数据点。
通过求解多项式系数a0, a1, ..., an,就可以得到拟合的多项式曲线。
3. 多项式曲线拟合的实现在C语言中,我们可以通过最小二乘法来实现多项式曲线拟合。
最小二乘法是一种数学优化方法,通过最小化误差的平方和来求解多项式系数。
具体实现步骤如下:(1)定义多项式函数我们需要定义一个多项式函数来表示拟合的曲线。
在C语言中,可以通过数组来存储多项式系数,然后编写函数来计算多项式函数的取值。
(2)构造系数矩阵和常数矢量我们需要根据已知的数据点构造系数矩阵和常数矢量。
系数矩阵的每一行对应一个数据点的x值,并且每一列对应一个多项式系数。
常数矢量则对应已知的数据点的y值。
(3)求解线性方程组接下来,我们需要求解线性方程组来得到多项式系数。
可以使用高斯消去法、LU分解法等方法来求解线性方程组。
(4)计算拟合曲线的取值通过求解得到的多项式系数,我们可以计算拟合曲线上任意点的取值。
这样就实现了多项式曲线拟合的过程。
4. 示例代码下面是一个简单的C语言实现多项式曲线拟合的示例代码:```c#include <stdio.h>// 定义多项式函数float polynomial(float x, float coefficients[], int n) {float result = 0.0;for (int i = 0; i <= n; i++) {result += coefficients[i] * pow(x, i);}return result;}int m本人n() {// 已知数据点float x[] = {1.0, 2.0, 3.0, 4.0, 5.0};float y[] = {2.0, 3.0, 4.0, 5.0, 6.0};// 构造系数矩阵和常数矢量int n = 2; // n次多项式拟合float A[3][3] = {{5.0, 15.0, 55.0}, {15.0, 55.0, 225.0}, {55.0, 225.0, 979.0}};float b[3] = {20.0, 74.0, 292.0};// 求解线性方程组// (使用高斯消去法或其他方法求解)// 计算拟合曲线的取值float coefficients[] = {1.0, 1.0, 1.0}; // 临时设定的系数float result = polynomial(6.0, coefficients, n);// 打印拟合曲线的取值printf("The value of the fitted polynomial at x=6 is f\n", result);return 0;}```5. 总结通过多项式曲线拟合,我们可以用数学模型来描述已知的数据点,并用拟合曲线来预测和分析其他数据。
最小二乘法曲线拟合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语言曲线拟合曲线拟合(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个数据点,然后使用最小二乘法计算了二次多项式的系数。
最后,我们输出了拟合曲线的公式。
5阶多项式曲线拟合 c语言实现

5阶多项式曲线拟合 c语言实现曲线拟合是一种统计分析方法,用于拟合观测数据点集合的一条曲线。
其中,多项式曲线拟合是一种简单而常用的方法,可以通过多项式函数来拟合数据。
本篇文章将介绍如何使用C语言实现5阶多项式曲线拟合。
在C语言中,我们可以通过使用最小二乘法来进行多项式曲线拟合。
最小二乘法是一种数学优化方法,可以找到最能拟合数据的曲线。
对于5阶多项式曲线拟合,我们可以使用以下的多项式函数形式:y = a0 + a1*x + a2*x^2 + a3*x^3 + a4*x^4 + a5*x^5其中,y是拟合曲线在x处的值,a0, a1, a2, a3, a4, a5是曲线的系数,x是已知的数据点。
首先,我们需要定义一个结构体来表示数据点的坐标:```ctypedef struct {double x;double y;} Point;```接下来,我们可以编写一个函数来计算5阶多项式曲线的拟合系数。
该函数的输入为数据点的数组和数据点的数量,输出为曲线系数的数组:```cvoid fitPolynomialCurve(Point data[], int numPoints, double coefficients[]) {// 初始化矩阵和向量double matrix[6][6] = {0}; // 6x6的矩阵double vector[6] = {0}; // 长度为6的向量// 构造矩阵和向量for (int i = 0; i < numPoints; i++) {double x = data[i].x;double y = data[i].y;double xPower = 1;for (int j = 0; j < 6; j++) {vector[j] += y * xPower;for (int k = 0; k < 6; k++) {matrix[j][k] += xPower;xPower *= x;}}}// 解线性方程组// ...// 计算曲线系数// ...// 返回曲线系数的数组// ...}```上述代码中的解线性方程组和计算曲线系数的步骤可以使用线性代数库或自行实现。
曲线拟合算法 代码 c语言

曲线拟合算法代码 c语言(最新版)目录1.曲线拟合算法简介2.代码实现方法3.C 语言的特点4.结合 C 语言的曲线拟合算法实现5.应用实例与总结正文【1.曲线拟合算法简介】曲线拟合算法是一种在计算机科学和数学领域常用的方法,用于在给定数据点集合上找到最佳匹配的曲线。
这个算法的目标是找到一个曲线,使得这个曲线与给定的数据点集合的误差最小。
曲线拟合算法可以应用于很多领域,如数据分析、图像处理、信号处理等。
【2.代码实现方法】曲线拟合算法有很多实现方法,其中比较常见的有最小二乘法、多项式拟合、指数拟合等。
以多项式拟合为例,其基本思想是假设拟合曲线为一个多项式函数,然后通过最小化拟合误差来确定多项式的系数。
【3.C 语言的特点】C 语言是一种通用的、过程式的计算机程序设计语言,具有以下特点:1.语法简洁,易于掌握。
2.运行速度快,占用系统资源少。
3.具有高级语言的特性,如结构体、函数、指针等。
4.可以直接操作硬件,适用于底层开发。
【4.结合 C 语言的曲线拟合算法实现】将曲线拟合算法与 C 语言结合,可以充分利用 C 语言的特性,实现高效、稳定的曲线拟合。
以多项式拟合为例,可以按照以下步骤实现:1.定义一个结构体,用于存储多项式系数、拟合误差等信息。
2.编写一个函数,用于计算多项式拟合的系数。
这个函数可以利用 C 语言的数组和循环结构,实现对数据点集合的遍历和计算。
3.编写一个函数,用于计算拟合误差。
这个函数可以利用 C 语言的指针和函数调用,实现对多项式系数和数据点集合的快速访问。
4.在主函数中,调用上述两个函数,实现对给定数据点集合的拟合。
【5.应用实例与总结】通过 C 语言实现的曲线拟合算法,可以应用于各种数据分析和图像处理任务。
例如,可以用于对实验数据进行拟合,得到数据的规律;可以用于对图像进行平滑处理,提高图像的质量等。
曲线拟合C语言程序

#include<stdio.h>#include<math.h>void nihe();void gs();void main(){int i,j,m,n;float o[50];float x[50] , y[50] ,a[50][50];printf("输入数据节点数n = ",n);scanf("%d",&n);for( i=1;i<=n;i++){printf(" i = %d\n",i);}printf("各节点的数据x[i] \n");for(i=1;i<=n;i++){printf("x[%d] = ",i);scanf("%f",&x[i]);}printf("各节点的数据y[i] \n");for(i=1;i<=n;i++){printf("y[%d] = ",i);scanf("%f",&y[i]);}printf("\n");printf("拟合的多项式次数m = ", m);scanf("%d",&m);}void nihe(float x[50], float y[50], int m ,int n) {int i,j,k=0,c=1,w=1;float f,a[50][50] , o[50];;do{f=0;for(i=1;i<=n;i++){f=f+pow( x[i] , k)*pow( x[i] , k);}a[c][c]=f ;a[c+1][c-1]=f;a[c-1][c+1]=f;c++;k++;}while(k<=m);k=1;c=1;do{f=0;for(i=1;i<=n;i++){f=f+pow( x[i] , k);}a[c+1][c]=f;a[c][c+1]=f;c++;k++;k++;}while(k<=m+1);k=0;c=1;do{f=0;for(i=1;i<=n;i++){f=f+y[i]*pow( x[i] , k);}k++;a[c][m+2]=f;c++;}while(k<=m);for(i=1;i<=m+1;i++){for(j=1;j<=m+2;j++){printf("%f\t",a[i][j]);}printf("\n");}printf("------------------------------------------------------------------------\n"); }void gs(float a[50][50], float o[50], int m){int i,j,c=1,z=1,t=1,w=1,n;float l,max,p,q;n=m+1;do{max=a[z][t];for(i=z+1,j=t;i<=n;i++){if(fabs(a[i][j])>fabs(max)){max=a[i][j];w=i;}else{w=z;}}if(c<=n-1){for(i=z,j=t;j<=n+1;j++){q=a[i][j];a[i][j]=a[w][j] ;a[w][j]=q;}}for(i=1;i<=n;i++){for(j=1;j<=n+1;j++){printf("%f\t",a[i][j]);}printf("\n");}printf("------------------------------------------------------------------------\n");for(i=z,w=t;i<=n;i++){l=a[i+1][w]/a[w][w];for(j=1;j<=n+1;j++){a[i+1][j]=a[i+1][j]-l*a[w][j];}}z++;t++;c++;}while(c<=n);if(a[n][n]==0){printf("矩阵奇异\n");return;}else{i=n;o[i]=(a[i][n+1]/a[i][i]);for(i=n-1;i>=1;i--){p=0;for(j=i;j<n;j++){p=p+a[i][j+1]*o[j+1];}o[i]=(a[i][n+1]-p)/a[i][i];}}for(i=1;i<=m+1;i++){printf("o[%d]=%f\n",i,o[i]);}}。
用c语言实现离散点拟合曲线

用c语言实现离散点拟合曲线离散点拟合曲线是一种利用已知数据点来推断未知数据点的方法。
在计算机科学领域,离散点拟合曲线通常是一个重要的问题,因为它可以帮助我们在数据可视化,数据分析和数据预测中更好地理解数据的变化。
在C语言中实现离散点拟合曲线有多种方法,下面介绍其中一种通用的方法,即使用最小二乘法。
最小二乘法是一种对数据进行拟合的方法,它基于最小化数据点和曲线之间的距离来查找最符合数据的函数。
下面是C语言实现离散点拟合曲线的步骤:1. 收集数据点,包括x和y的坐标。
2. 创建一个公式来表示拟合曲线(例如,直线,二次曲线等等)。
3. 对于每个数据点,计算该点在拟合曲线上的值,并计算该值与实际值之间的距离。
4. 最小化所有距离的平方和。
这就是所谓的最小二乘法。
5. 可以使用数值计算库(例如GNU Scientific Library)来解决最小二乘法问题,或手动实现。
下面是一个使用C语言手动实现最小二乘法来拟合一条直线的示例代码:```c#include <stdio.h>#include <stdlib.h>#define MAX_POINTS 50int main() {int num_points;double x[MAX_POINTS], y[MAX_POINTS], sum_x = 0.0, sum_y = 0.0, sum_xx = 0.0, sum_xy = 0.0;double a, b;printf("Enter the number of data points: ");scanf("%d", &num_points);if (num_points > MAX_POINTS) {printf("Too many data points, exiting...\n");exit(1);}for (int i = 0; i < num_points; i++) {printf("Enter point %d (x, y): ", i+1);scanf("%lf %lf", &x[i], &y[i]);sum_x += x[i];sum_y += y[i];sum_xx += x[i] * x[i];sum_xy += x[i] * y[i];}a = (num_points * sum_xy - sum_x * sum_y) / (num_points * sum_xx - sum_x * sum_x);b = (sum_y - a * sum_x) / num_points;printf("\nThe linear equation that best fits the given data:\n"); printf("y = %.2lfx + %.2lf\n", a, b);return 0;}```在上述示例代码中,我们首先使用`scanf()`函数获取数据点的数量和每个数据点的x和y坐标。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
^
#include<>
#include<>
void nihe();
void gs();
void main()
{
int i,j,m,n;
float o[50];
\
float x[50] , y[50] ,a[50][50];
printf("输入数据节点数 n = ",n);
scanf("%d",&n);
for( i=1;i<=n;i++)
{
printf(" i = %d\n",i);
}
printf("各节点的数据 x[i] \n");
、
for(i=1;i<=n;i++)
{
printf("x[%d] = ",i);
scanf("%f",&x[i]);
}
printf("各节点的数据 y[i] \n");
for(i=1;i<=n;i++)
{
¥
printf("y[%d] = ",i);
scanf("%f",&y[i]);
}
printf("\n");
printf("拟合的多项式次数 m = ", m);
scanf("%d",&m);
¥
}
void nihe(float x[50], float y[50], int m ,int n) {
int i,j,k=0,c=1,w=1;
float f,a[50][50] , o[50];;
~
do
{
f=0;
for(i=1;i<=n;i++)
{
f=f+pow( x[i] , k)*pow( x[i] , k);
}
…
a[c][c]=f ;
a[c+1][c-1]=f;
a[c-1][c+1]=f;
c++;
k++;
}while(k<=m);
,
k=1;c=1;
do
{
f=0;
for(i=1;i<=n;i++)
{
f=f+pow( x[i] , k);
}
*
a[c+1][c]=f;
a[c][c+1]=f;
c++;
k++;
k++;
}while(k<=m+1);
)
k=0;c=1;
do
{
f=0;
for(i=1;i<=n;i++)
{
f=f+y[i]*pow( x[i] , k);
,
}
k++;
a[c][m+2]=f;
c++;
}while(k<=m);
for(i=1;i<=m+1;i++)
{。
for(j=1;j<=m+2;j++)
{
printf("%f\t",a[i][j]);
}
printf("\n");
}
,
printf("------------------------------------------------------------------------\n");
}
void gs(float a[50][50], float o[50], int m)
{
int i,j,c=1,z=1,t=1,w=1,n;
float l,max,p,q;
-
n=m+1;
do
{
max=a[z][t];
for(i=z+1,j=t;i<=n;i++)
{
{
if(fabs(a[i][j])>fabs(max))
{
max=a[i][j];
w=i;
}
else
{
~
w=z;
}
}
if(c<=n-1)
{for(i=z,j=t;j<=n+1;j++)
{
q=a[i][j];
a[i][j]=a[w][j] ;
)
a[w][j]=q;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
{
printf("%f\t",a[i][j]);
-
}
printf("\n");
}
printf("------------------------------------------------------------------------\n");
for(i=z,w=t;i<=n;i++)
{
l=a[i+1][w]/a[w][w];
(
for(j=1;j<=n+1;j++)
{
a[i+1][j]=a[i+1][j]-l*a[w][j];
}
}
z++;
t++;
c++;
-
}while(c<=n);
if(a[n][n]==0)
{
printf("矩阵奇异\n");
return;
}
else
{
i=n;
o[i]=(a[i][n+1]/a[i][i]);
for(i=n-1;i>=1;i--)
{
p=0;
for(j=i;j<n;j++)
{
p=p+a[i][j+1]*o[j+1];
}
o[i]=(a[i][n+1]-p)/a[i][i];
}
}
for(i=1;i<=m+1;i++)
{
printf("o[%d]=%f\n",i,o[i]);
}
}。