zoukankan      html  css  js  c++  java
  • 多项式拟合+高斯消元解方程组

    #include<iostream>
    #include<cmath>
    #include<vector>
    using namespace std;
    void func(float**p,float *q,float *r,int n)
    {
    	//Gauss消元
    	int i,j,k,t;
    	for(i = 0;i<n-1;i++)
    	{
    		//选主元模块 顺序gauss消元可不要
    		int tmp = i;
    		float max = fabs(p[i][i]);
    		for(t = i+1;t<n;t++)
    		{
    			if(fabs(p[t][i]) > max)
    				tmp = t;
    		}
    		for(t = i;t<n;t++)
    		{
    			float tmp2 = p[i][t];
    			p[i][t] = p[tmp][t];
    			p[tmp][t] = tmp2;
    		}
    		float tmp3 = q[i];
    		q[i] = q[tmp];
    		q[tmp] = tmp3;
    		if(p[i][i] == 0)
    		{
    			cout<<"gauss消元失败"<<endl;
    			return;
    		}
    		//消元模块
    		for(j = i+1;j<n;j++)
    		{
    			for(k = i+1;k<n;k++)
    			{
    				p[j][k] = -p[j][i]*1.0/p[i][i]*p[i][k] + p[j][k];
    			}
    			q[j] = -p[j][i]*1.0/p[i][i]*q[i] + q[j]; 
    		}
    	}
    	//回带模块
    	r[n-1] = q[n-1]*1.0/p[n-1][n-1];
    	for(i = n-2;i>=0;i--)
    	{
    		float tmp = 0.0;
    		for(j = i+1;j<n;j++)
    		{
    			tmp+= p[i][j]*r[j];
    		}
    		r[i] = (q[i]-tmp)*1.0/p[i][i];
    	}
    }
    int main()
    {
    	int m;
    	cout<<"输入拟合多项式的次数"<<endl;
    	while(cin>>m && m != -1)
    	{
    		//m次多项式曲线
    		int sum = 0,i,j,k;
    		cout<<"输入x和y的有序对 x=0&&y=0时输入结束"<<endl;
    		vector<float>x,y;
    		float x0,y0;
    		while(cin>>x0>>y0 && !(x0 == 0 && y0 == 0))
    		{
    			x.push_back(x0);
    			y.push_back(y0);
    			sum ++;
    		}
    		float **p = new float*[m+1];
    		float *q = new float[m+1];
    		float *r = new float[m+1];
    		for(i = 0;i<m+1;i++)
    			p[i] = new float[m+1];
    		for(i = 0;i<m+1;i++)
    		{
    			for(j = 0;j<m+1;j++)
    			{
    				float tmp = 0.0;
    				for(k = 0;k<sum;k++)
    				{
    					tmp += pow(x[k],i+j);
    				}
    				p[i][j] = tmp;
    			}
    		}
    		for(i = 0;i<m+1;i++)
    		{
    			float tmp = 0.0;
    			for(j = 0;j<sum;j++)
    			{
    				float tmp2 = pow(x[j],i);
    				tmp += y[j]*tmp2;
    			}
    			q[i] = tmp;
    		}
    		cout<<m<<"次多项式系数为"<<endl;
    		func(p,q,r,m+1);
    		for(i = 0;i<m+1;i++)
    		{
    			cout<<r[i]<<" ";
    		}
    		cout<<endl;
    		cout<<"输入拟合多项式的次数"<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    第10组 Alpha冲刺(4/4)
    python2中的新式类与经典类区别
    http请求Content-Type有几种
    2020 年软件设计师考试大纲
    11-Elasticsearch之-组合查询
    16-扩展阅读-摘录
    各种排序算法
    Vmware虚拟机三种网络模式详解(转载)
    无法访问 CentOS7服务器上应用监听的端口
    VsCode 常用插件清单
  • 原文地址:https://www.cnblogs.com/tianyuxuepiao/p/2737569.html
Copyright © 2011-2022 走看看