多项式曲线拟合 c语言6,多项式曲线拟合 C++程序

本文介绍了一个使用C++编写的程序,涉及交换两个整数变量的值,以及计算和解决正规方程组的过程。通过f1和f2函数处理矩阵元素,直接主元LU分解算法(DirectLU)用于求解线性方程组。关键步骤包括矩阵初始化、函数应用和解的计算。
摘要由CSDN通过智能技术生成

//交换两个变量的值

int main()

{

int i,j;

double x[NUM]; //存储原始的节点

x[0]=1;

for(i=1;i

x[i]=x[i-1]+0.5;

double

y[NUM]={33.4,79.50,122.65,159.05,189.15,214.15,238.65,252.50,

267.55,280.50,296.65,301.40,310.40,318.15,325.15};

double a[N][NUM];

double b[N][N+1]; //正规方程组的系数矩阵和右侧矩阵

double c[N];

f1(a[0],x);

cout<

for(i=0;i

{

for(j=0;j

cout<

cout<

}

f2(a[0],b[0],y); //计算正规方程组的系数矩阵

cout<

cout<

for(i=0;i

{

for(j=0;j<=N;j++)

cout<

cout<

}

DirectLU(b,c); //列主元LU分解

cout<

cout<

for(i=0;i

cout<

cout<

return 0;

}

void f1(double *a,double *x)

{

int i,j,k;

double temp;

for(i=0;i

for(j=0;j

{

temp=1;

for(k=0;k

temp*=x[j];

*(a+i*NUM+j)=temp;

}

}

void f2(double *a,double *b,double y[])

{

int i,j,k;

double temp2;

for(i=0;i

{

for(j=0;j

{

temp2=0;

for(k=0;k

temp2+=*(a+i*NUM+k)*(*(a+j*NUM+k));

*(b+i*(N+1)+j)=temp2;

}

temp2=0;

for(k=0;k

{

temp2+=y[k]*(*(a+i*NUM+k));

*(b+i*(N+1)+N)=temp2;

}

}

}

void swap(double &a,double

&b)

{

a=a+b;

b=a-b;

a=a-b;

}

void DirectLU(double a[N][N+1],double x[])

{

int i,r,k,j;

double s[N],t[N];

double max;

for(r=0;r

{

max=0;

j=r;

for(i=r;i

{

s[i]=a[i][r];

for(k=0;k

s[i]-=a[i][k]*a[k][r];

s[i]=s[i]>0?s[i]:-s[i]; //s[i]取绝对值

if(s[i]>max){

j=i;

max=s[i];

}

}

if(j!=r) //选出的主元所在行j若不是r,则对两行相应元素进行调换

{

for(i=0;i

swap(a[r][i],a[j][i]);

}

for(i=r;i

for(k=0;k

a[r][i]-=a[r][k]*a[k][i];

}

for(i=r+1;i

{

for(k=0;k

a[i][r]-=a[i][k]*a[k][r];

a[i][r]/=a[r][r];

}

}

for(i=0;i

t[i]=a[i][N];

for(i=N-1;i>=0;i--) //利用回代法求最终解

{

for(r=N-1;r>i;r--)

t[i]-=a[i][r]*x[r];

x[i]=t[i]/a[i][i];

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值