c语言如何对若干离散点进行m阶多项式拟合

作者&投稿:单于雅 (若有异议请与网页底部的电邮联系)
如何用c语言编写32阶多项式拟合函数?~

这与几阶多项式无关,关键是用什么方法拟合。如果只有33个数据点,解一族线性方程就可以了,如果有很多组数据,就用最小而乘法,步骤略微多一些。看看计算方法的书就任意操作了。

#include
#include
#include

int p=4;//p为选定的拟合次数并加1,默认值为4,即拟合次数3
int t=5;//t为用户输入的数据的个数
void printa(double a[5][5])
{
int i,j;
for(j=1;j<=p;j++)
{
for(i=1;i<=p;i++)
{
printf("a[%d][%d]=%5.2e",j,i,a[j][i]);
}
printf("
");
}
}
void printb(double b[5])
{
int i;

for(i=1;i<=p;i++)
{
printf("b[%d]=%5.2e",i,b[i]);
}
printf("
");

}
main()
{
int i=1,j=1, k=1, r; //在程序中为中间变量来记录循环次数
double ss=0; // 在计算矩阵中未知参数的临时变量
double temp,m; //中间变量
double x[6]={0,5,10,15,20,25},y[6]={0,1.0029,1.0023,1.0000,0.9990,0.9983};//x[]为用户输入的横坐标的值
double a[5][5];//a[ ][ ] 记录在最小二乘算法中产生的系数矩阵
double b[5];//常数矩阵的元素的值

for(i=1;i<=5;i++)
{
printf("x[%d]=%5.2e ",i,x[i]);
}
printf("
");
for(i=1;i<=5;i++)
{
printf("y[%d]=%5.2e ",i,y[i]);
}
printf("
");
//计算系数矩阵的每个元素 a[i][j]和a[j][i]
for(j=1;j<=p;j++) //p为选定的拟合次数并加1,默认值为4,即拟合次数3
{
for(i=1;i<=j;i++)
{
ss=0;
for( k=1;k<=t;k++)
{ //t为用户输入的数据的个数
ss=ss+pow(x[k],i+j-2);
} //x[]为用户输入的横坐标的值
a[i][j] = ss; //ss为临时变量
a[j][i]= ss;
} //a[ ][ ] 记录在最小二乘算法中产生的系数矩阵
}
printa(a);
//计算常数矩阵的每个元素的值
for(i=1;i<=p;i++)
{
ss=0;
for(k=1;k<=t;k++)
{
ss=ss+y[k]*pow(x[k],i-1);
} //y[ ]为用户的输入的纵坐标值
b[i] = ss;
}
printb(b);
//用Guass消去法解线性方程组
for(k=1;k<=p;k++)
{
m=fabs(a[k][k]);//计算a[k][k]的绝对值
r=k;
//选主元
for(i=k;i<=p;i++)
{
if( m<fabs(a[i][k]))
{
m=fabs(a[i][k]);
r=i;
}
}
if(r>k)
{ //交换两行
for(j=k;j<=p;j++)
{
temp=a[k][j];
a[k][j]=a[r][j];
a[r][j]=temp;
}
temp=b[k];
b[k]=b[r];
b[r]=temp;
}
//消元计算
for(j=k+1;j<=p;j++)
a[k][j]=a[k][j]/a[k][k];
b[k]=b[k]/a[k][k];
for(i=1;i<=p;i++)
{
if(i==k)
continue;
for(j=k+1;j<=p;j++)
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
for(i=1;i<=p;i++)
{
if(i==k)
continue;
b[i]=b[i]-a[i][k]*b[k];
}
}
//拟合多项式
printf("
Result=");
for(i=1;i<=p;i++)
{
printf("%5.2e x^%d+",b[i],i-1);
}
}
结果看最后:
a[1][1]=5.00e+000 a[1][2]=7.50e+001 a[1][3]=1.38e+003 a[1][4]=
2.81e+004
a[2][1]=7.50e+001 a[2][2]=1.38e+003 a[2][3]=2.81e+004 a[2][4]=
6.12e+005
a[3][1]=1.38e+003 a[3][2]=2.81e+004 a[3][3]=6.12e+005 a[3][4]=
1.38e+007
a[4][1]=2.81e+004 a[4][2]=6.12e+005 a[4][3]=1.38e+007 a[4][4]=
3.21e+008
b[1]=5.00e+000 b[2]=7.50e+001 b[3]=1.37e+003 b[4]=2.81e+004

Result=1.00e+000 x^0 4.42e-004 x^1 -5.69e-005 x^2 1.33e-006 x^3
========拟合次数2============
x[1]=5.00e+000 x[2]=1.00e+001 x[3]=1.50e+001 x[4]=2.00e+001 x[5]=2.50e+001

y[1]=1.00e+000 y[2]=1.00e+000 y[3]=1.00e+000 y[4]=9.99e-001 y[5]=9.98e-001

a[1][1]=5.00e+000 a[1][2]=7.50e+001 a[1][3]=1.38e+003
a[2][1]=7.50e+001 a[2][2]=1.38e+003 a[2][3]=2.81e+004
a[3][1]=1.38e+003 a[3][2]=2.81e+004 a[3][3]=6.12e+005
b[1]=5.00e+000 b[2]=7.50e+001 b[3]=1.37e+003

Result=1.00e+000 x^0+ -3.44e-004 x^1+ 3.14e-006 x^2+

m阶多项式拟合,是算法问题,不是计算机语言问题。你先要有你的具体计算策略和方法,数值计算时,用计算机语言写出程序,算出结果。用 c 语言 或 fortran 语言 或别的语言,大同小异,没有原则差别。
你先要定出你的方程形式,例如
y = a1*x^m+a2*x^(m-1)+...am
a1,a2,...,am 是 m 个待定系数
把你的离散点[xi,yi] 代入方程,你可以得到 线性方程式 yi = a1*xi^m+a2*xi^(m-1)+...am
若你有 n 个点,就得到 n 个 方程式。若 n<m 有无穷解,若 n=m 有一解。
通常 离散点的个数 远超过 方程阶数,也就是方程个数超出要解的未知数的个数,n>m,这时,
通常 用 最小二乘法 求解 这个线性方程组。也就是所谓的拟合。
最小二乘法 求解 这个线性方程组 的程序 网上(这里不敢写,写了,你就看不到我的贴子了)可以找到,自己写也不复杂。
曲线拟合文章估计百度文库里也有。


仿真语言分类
在仿真语言的分类中,首先根据被仿真的系统特性,我们可以将其划分为三大类别。第一类是连续系统仿真语言,它专注于模拟那些动态变化且过程连贯的系统,如物理学中的流体动力学或电子电路。第二类是离散系统仿真语言,这类语言主要处理的是非连续或事件驱动的系统,例如计算机程序或通信网络。它们通常处理的是...

如何在R语言中使用Logistic回归模型
4)Logistic回归没有关于自变量分布的假设条件,可以是连续变量、离散变量和虚拟变量;5)由于因变量和自变量之间不存在线性关系,所以参数(偏回归系数)使用最大似然估计法计算。logistic回归模型概述 广义线性回归是探索“响应变量的期望”与“自变量”的关系,以实现对非线性关系的某种拟合。这里面涉及到一个...

C语言如何把汉字映射为数字?
很容易的。汉字总共才几万个。从1开始编号,最多也不会超过10万。比如:1-好 2-人 3-中 。。。用一个int型数组就够了。int map[100000];总共也才40万字节,不到400KB。

跪求!!用VC++语言将离散的点拟合成光滑曲线
一般用3次样条曲线:x(t) = ax*t^3 + bx*t^2 + cx*t + dx y(t) = ay*t^3 + by*t^2 + cy*t + dy z(t) = az*t^3 + bz*t^2 + cz*t + dz 构成 曲线参数方程 C(t) = a * t^3 + b * t^2 + c * t + d;0 <= t <= 1.常用 4 点 B样条。它的...

离散数学的划分是怎样的?
离散数学离散数学是传统的 逻辑学, 集合论(包括 函数), 数论基础, 算法设计, 组合分析,离散 概率, 关系理论, 图论与 树, 抽象代数(包括 代数系统, 群、 环、 域等), 布尔代数,计算模型(语言与 自动机)等汇集起来的一门 综合学科。离散数学的应用遍及现代科学技术的诸多领域。

什么叫表征?如材料表征
表征是指信息记载或表达的方式,能把某些实体或某类信息表达清楚的形式化系统以及说明该系统如何行使其职能的若干规则。因此,我们可以这样理解,表征是指可以指代某种东西的符号或信号,即某一事物缺席时,它代表该事物。材料表征是通过对材料结构信息和特性数据的加工得出的一种描述或解释,表征是在材料分析...

R语言中ppois如何应用
ppois是泊松分布的分布函数(即用来求累计概率),因为是离散的,所以只会在整数左右有变化,看最下面的图像比较容易懂,比如q=0.5就和q=0.9的结果一样,q=1就和q=1.2的结果一样。一般用法:ppois(q, lambda, lower.tail = TRUE, log.p = FALSE)q:官方帮助文档说是分位数,我理解是指定...

最能反映自然语言真实特征的编码转换算法——反向快速傅立叶变换及其...
一个具体的应用实例是Reetz团队的定向进化工作,他们使用反向快速傅立叶变换对AAindex编码后的蛋白性质离散数字信号进行连续数字特征的转换。进一步结合酶活性作为标签构建了PLS回归模型,用于预测和筛选酶活性,展示了这一方法在生物学中的实际应用。综上所述,通过将自然语言处理与傅立叶变换相结合,特别是...

怎样避免语言禁忌现象
语言禁忌,是很富有地方方言或社会方言特色的语言风俗现象。 禁忌的原则,大体是出于吉凶、礼教、功利、荣辱等诸种考虑, 其具体内容有以下几方面。 凶语即不吉利的词语,在日常生活中,人们是忌讳听到凶语的, 惟恐这些字眼会招致凶祸的真正来临。然而在人际交往中, 经常要表达不祥的内容,这便更改用另一些褒义或中性词...

语言学概论笔记(第一章)(4)
7、应该如何理解语言符号的任意性 答:“符号”有一个根本特性,那就是任何符号都是约定俗成的,符号的物质实体和表示的意义之间没有必然的理据关系。8、语言符号的离散特征和线形特征对语言系统的结构特点有什么重大意义。答:语言符号的离散特征和线形特征使语言系统的组合单位的成员之间,整个语流的...

张家界市18427192219: c语言如何对若干离散点进行m阶多项式拟合 -
学卓依路: m阶多项式拟合,是算法问题,不是计算机语言问题.你先要有你的具体计算策略和方法,数值计算时,用计算机语言写出程序,算出结果.用 c 语言 或 fortran 语言 或别的语言,大同小异,没有原则差别.你先要定出你的方程形式,例如 y = ...

张家界市18427192219: c语言 跪求:输入M个数从中取N个数进行组合并输出所有组合项 -
学卓依路: 典型的组合问题,解法有递归、回溯等等 递归法较简单,代码如下:void combine(int a[], int n, int m, int b[], int M);参数: a 存放候选数字 n 总项数 m 取出项数 b 存放选出结果 M = m#include "stdio.h" #define MAX 100void combine(int ...

张家界市18427192219: 在C语言中编程实现建立无向图的邻接表,输出某个点的邻接点~! -
学卓依路: 用矩阵表示无向图的,设有M个节点,则建立一个MXM矩阵,对每个顶点添加它的邻接点,即每行中对于有标记的列为该行顶点的邻接点.

张家界市18427192219: C语言:设abcd均为0执行(m=a==b)&&(n=c!=d)后 m n的值为 -
学卓依路: 执行 (m=a=b)&&(n=c!=d) 先判断&&是左结合,算左括号,然后=(赋值)优先级低,先算a=b得到真赋值给m,m为1,然后整个括号内表达式为1;因为1 and 任意值 都为真!因此继续看右边,c!=d为假,所以n=0 如果是左括号值为假,则如果右边的n的值就为不确定!因为0&&任何值都为假有不对的请指教!

张家界市18427192219: c语言编程 2.计算并输出 m!/(m - n)!n! -
学卓依路: #include int pq(int n)//计算n的阶乘 { int temp=1; while(n>=1) { temp=temp*n; n--; } return temp; } void main() { int m,n; printf("please input m:"); scanf("%d",&m); printf("please input n:"); scanf("%d",&n); if(m>=n&&n>=0)//判断输入格式,...

张家界市18427192219: 在C语言中,设有如下定义: int a=1,b=2,c=3,d=4,m=2,n=2; 则执行表达式:(m=a>b)&&(n=c>d)后,n的值为,过程 -
学卓依路: n的值仍然为2,没有改变! 过程: 先计算a>b,值为0,赋给m的值为0,表达式m=a>b的值也是0. 对于&&逻辑运算,不管后面(n=c>d)的值如何,都不影响(m=a>b)&&(n=c>d)的最终结果,因此,C语言不再对表达式n=c>d进行计算.因而n的值没有改变!!

张家界市18427192219: 用C语言怎样求多项高次方程的值 -
学卓依路: 循环运算,让x从0开始,一直计算下去........ for(int x=0;x<=10000;x++) ................

张家界市18427192219: 关于C语言的问题:如何用C语言实现n阶行列式和矩阵的值
学卓依路: 输入: 3---7 2---1 得出错误结果. 而当输入n=3 0---1---3 3---0---2 5---2---0 时也会得出错误结果. 错误的原因有2: 1 是数据类型不对,匿名的程序是设定输入都是整数int,显然按照行列式的定义结果肯定是整数,但是他程序中使用了整型数的除...

张家界市18427192219: 对1 - 1/2+1/3 - 1/4......1/n进行C语言编程 -
学卓依路: #include void main() { int i,n;float s; printf("请输入整数:\n"); scanf("%d",&n); s=0; for (i=1;i s=s+pow(-1,i+1)/i; printf("%f\n",s); } 注:要求a的b次方,就用pow(a,b)即可.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网