当前位置:文档之家› 多项式实验报告

多项式实验报告

多项式实验报告
多项式实验报告

实验报告

时间:20100611 专业:09级计算机 学号:09052014 姓名:赖云 【题目】:设一元多项式的一个项可以用整数数组的2个元素来表示:

我们可以利用数组来表示一个多项式。例如多项式:

3x^9-6X^4+2x+7=0 可表示为

设每个一元多项式项数都不会超过十项。 编出程序实现如下功能:

1.在键盘上输入指数ne 和系数nf ,分别生成两个一元多项式HA 和HB ;

2.输出一元多项式HA 和HB;

3.把一元多项式HA 和HB 相加,生成新的一元多项式HC(HC 可能超过十项);

4.输出新形成的一元多项式HC(原HA 、HB 不变);

5.询问“Contine(n)?”,当输入回答字符‘n ’时结束,否则回第1点继续执行。 注意:

(1) 进行多项式相加时,只有该两项的指数相同时才能相加,若相加后系数为0,则

取消该项;

(2) 建立多项式,可以严格按指数从大到小的次序输入,此时,当发现当前项的指数

比前一项的指数大时,则要求重新输入; (3) 若建立多项式时可以不按指数由大到小输入时。则应在输入结束后用程序进行调

整,使数组内多项式各项依指数从大到小次序存放; (4) 在一个多项式中若发现有两项(或两项以上)的指数相等时,应进行合并,或合

并后系数为0则取消该项;

(5) 多项式输出形式:设有多项式3X^8-2X+7,则输出形式为: 3X^8-2X^1+7X^0 或

3X8-2X1+7X0

[进一步要求]:依链表形式,编程实现上述功能。 【解题基本算法】:(1)输入一个多项式HA 生成一条链,输出该多项式HA ;再输入一个多项式HB 生成另一条链,输出该多项式HB; (2)HA 和HB 相加生成HC :

若HA 和HB 均为空,置HC 为0,返回HC ;

若HA 不空,HB 为空,则把HA 复制到HC 中,返回HC ; 若HA 为空,HB 不空;把HB 复制到HC 中,返回HC ;

若HA 和HB 均不空,则分别给HA 、HB 、

HC 初始化:p=HA,q=HB,t=HC;

当HA 和HB 均不空时:

a) 若HA的指针P 所指向的指数与HB的指针q 所指向的指数相等,则令指针p

所指向的系数与q 所指向的系数相加为x:○1若x 为0,则p 、 q 指针分别指向下

一结点;○2若x不为0,则申请一个新结点s,把p所指向的指数赋给s所指向

的指数,把x的值赋给s所指向的系数,然后把s结点写入到HC链的t结点,

然后t、p、q分别指向下一个结点;

b)若HA的指针P所指向的指数大于HB的指针q所指向的指数,则申请生成一

个新结点s,把p所指向的指数和系数赋给s,再把s结点写入HC链的末尾,

然后p、t指针分别向后移一步;

c)若HA的指针P所指向的指数小于HB的指针q所指向的指数,则申请生成一

个新结点s,把p所指向的指数和系数赋给s,再把s结点写入HC链的末尾,

然后q、t指针分别向后移一步;

当HA链被取空时,则把HB链余下部分抄入HC链,返回HC;

当HB链被取空时,则把HA链余下部分抄入HC链,返回HC;

当HA和HB都被取空时,返回空指针;

【主要调试方案:】

○1先输入指数和系数,判断输出的多项式是否正确以测试创建的链表和输出的格式是否正确;

○2输入系数和指数生成两条空链HA和HB,测试相加后输出的HC链是否为空;

○3输入系数和指数分别生成一条空链HA和一条多项式链HB,测试相加后输出的HC链是否为HB链存储的多项式;

○4输入系数和指数分别生成两条非空链HA和HB,测试相加后输出的HC链是否为正确的结果;

【主要测试数据:】

――――――first――――

nenf

89

3-7

0-5

00

―――HA――――

HA=9x^8-7x^3-5 x^0

――――――second――――

nenf

00

―――――HB――――

HB=Error!Thelinkisempty!

――HC=HA+HB――――

HC=9x^8-7x^3-5x^0

Continue?Yes/anykey――No/(Norn):y

――――――first――――

nenf

00

―――――HA――――

HA=Error!Thelinkisempty!

――――――second――――

nenf

89

3-7

0-5

00

―――HB――――

HB=9x^8-7x^3-5 x^0

――HC=HA+HB――――

HC=9x^8-7x^3-5x^0

Continue?Yes/anykey――No/(Norn):y

――――――first――――

nenf

00

―――――HA――――

HA=Error!Thelinkisempty!

――――――second――――

nenf

00

―――――HB――――

HB=Error!Thelinkisempty!

――HC=HA+HB――――

HC=Error!Thelinkisempty!

Continue?Yes/anykey――No/(Norn):y

――――――first――――

nenf

89

3-7

13

0-5

00

―――――HA――――

HA=9x^8-7x^3+3x-5 x^0

――――――second――――

nenf

9-5

56

4-4

00

―――――HB――――

HB=-5x^9+6x^5-4x^4+1x^2

――HC=HA+HB――――

HC=-5x^9+9x^8+6x^5-4x^4-7x^3+x^2+3x-5x^0

Continue?Yes/anykey――No/(Norn):y

――――――first――――

nenf

89

3-7

13

0-5

00

―――――HA――――

HA=9x^8-7x^3+3x^1-5 x^0

――――――second――――

nenf

8-9

35

22

1-3

00

―――――HB――――

HB=-9x^8+5x^3+2x^2-3x

――HC=HA+HB――――

HC=-2x^3+2x^2-5x^0

Continue?Yes/anykey――No/(Norn):y

――――――first――――

nenf

89

3-7

13

0-5

00

―――――HA――――

HA=9x^8-7x^3+3x^1-5 x^0

――――――second――――

nenf

98

8-7

00

―――――HB――――

HB=8x^9-7x^8+5x^5

――HC=HA+HB――――

HC=8x^9+2x^8+5x^5-7x^3+3x-5

Continue?Yes/anykey――No/(Norn):y

――――――first――――

nenf

89

3-7

00

―――――HA――――

HA=9x^8-7x^3

――――――second――――

nenf

97

8-9

46

35

12

0-5

00

―――――HB――――

HB=7x^9-9x^8+6x^4+5x^3+2x-5x^0

――HC=HA+HB――――

HC=7x^9+6x^4-2x^3+2x-5

Continue?Yes/anykey――No/(Norn):y

――――――first――――

nenf

89

5-7

45

3-1

00

―――――HA――――

HA=9x^8-7x^5+5x^4-x^3

――――――second――――

nenf

98

8-9

61

4-5

2-3

15

0-7

00

―――――HB――――

HB=8x^9-9x^8+x^6+7x^5-5x^4-3x^2+5x-7

――HC=HA+HB――――

HC=8x^9+x^6-x^3-3x^2+5x-7

Continue?Yes/anykey――No/(Norn):y

――――――first――――

nenf

99

8-8

00

―――――HA――――

HA=9x^9-8x^8

――――――second――――

nenf

77

6-6

55

4-4

33

2-2

11

09

00

―――――HB――――

HB=7x^7-6x^6+5x^5-4x^4+3x^3-2x^2+x+9

――HC=HA+HB――――

HC=9x^9-8x^8+7x^7-6x^6+5x^5-4x^4+3x^3-2x^2+x-9

Continue?Yes/anykey――No/(Norn):y

――――――first――――

nenf

89

5-7

3-1

05

00

―――――HA――――

HA=9x^8-7x^5-x^3+5

――――――second――――

nenf

8-9

57

31

0-5

00

―――――HB――――

HB=-9x^8+7x^5+x^3-5

――HC=HA+HB――――

HC=Error!Thelinkisempty!

Continue?Yes/anykey――No/(Norn):n【解题框图:】

【源程序】

#include

struct polynomial //定义一个数据结构类型{ int ne; 有两个成员ne,nf

int nf;

polynomial *next;

};

polynomial *creat() //创建链表

{ polynomial *h,*p,*q; //h指向头结点,p指向头结点,q指向头结点h=NULL;

p=new polynomial; //申请新结点

q=p;

cin>>p->ne>>p->nf;

while(((p->ne!=0&&p->nf!=0)||(p->ne==0&&p->nf!=0)||(p->ne!=0&&p->nf==0))& &p->ne>=0) // ne,nf均不为零

{ if(h!=NULL) q->next=p; //原链为空,在链头加入

else h=p; //原链不空,在链末加入

q=p; //修改末指针

p=new polynomial; //申请新结点

cin>>p->ne>>p->nf;

}

q->next=NULL;

return h;

} // creat end

void print(polynomial *h) //打印链表

{ if(h==NULL) { cout<<"Error!! The link is empty!"; return; } else

{ polynomial *p;

p=h;

while(p!=NULL)

{ if(p!=h&&p->nf>0) cout<<"+";

cout<nf<<"x^"<ne;

p=p->next;

}

}

} // print end

polynomial *add(polynomial *m,polynomial *n) // 两链相加

{ polynomial *h, *s, *d, *p,*q; float x;

h=NULL; // 新链头指针为空

p=m;q=n;

if(p==NULL&&q==NULL) return NULL; //两链为空

if(p!=NULL&&q==NULL) return p; //p链不空q链空

if(p==NULL&&q!=NULL) return q; //p链空q链不空

while ( p!=NULL && q!=NULL ) //p、q均不空

{

if ( p->ne==q->ne ) //指数相等

{ x=p->nf+q->nf; //系数相加

if ( x!=0 )

{ if(h==NULL) { s=new polynomial;s->next=NULL; //申请新结点

s->ne=p->ne;s->nf=x;

h=s;d=s;p=p->next;q=q->next;

}

else

{ s=new polynomial;s->next=NULL;

s->ne=q->ne; s->nf=x;

d->next=s; d=d->next;

q=q->next; p=p->next;

}

}

else { q=q->next; p=p->next; }

} // end if

else

{

if ( p->ne>q->ne ) // p指向指数大于q指向指数{ if(h==NULL) {s=new polynomial;s->next=NULL;

s->ne=p->ne;s->nf=p->nf;

h=s;d=s;p=p->next;

}

else

{ s=new polynomial;s->next=NULL;

s->ne=p->ne; s->nf=p->nf;

d->next=s; d=d->next; p=p->next;

}

}

else //q指向指数大于p指向指数{ if(h==NULL) { s=new polynomial;s->next=NULL;

s->ne=q->ne;s->nf=q->nf;

h=s;d=s;q=q->next;

}

else

{ s=new polynomial; s->next=NULL;

s->ne=q->ne; s->nf=q->nf;

d->next=s; d=d->next; q=q->next;

}

}

} //end else

}

//d->next=NULL;

while(p!=NULL) //q被取空p不空

{ d->next=p;

p=p->next;

d=d->next;

}

while(q!=NULL) // p被取空q不空

{ d->next=q;

q=q->next;

d=d->next;

}

return h;

}

void main() //主函数

{ polynomial *head,*p,*q,*t,*s;

char ch;

do //do----while

{ cout<<"\n------first--------\nne nf\n";

p=creat();

cout<<"\n--HA------\n";

cout<<"HA=";

print(p);

cout<<"\n\n----second----------\nne nf\n";

q=creat();

cout<<"\n--HB------\n";

cout<<"HB=";

print(q);

cout<<"\n\n--HC=HA+HB-------";

cout<<"\nHC=";

t=add(p,q);

print(t);

cout<<"\n\nContinue? Y es/any key--NO/(N or n): "; //判断是否继续

cin>>ch;

}while(ch!='N'&&ch!='n');

}

【主要体会和教训】

一、该程序一共用了三个调用函数和一个主函数,各函数中运用了很多选择判断语句;

二、在建立链表时一定要记得定义头指针、工作指针、末指针来方便后面的操作,而且要确

保每一条链都能够循着头指针指向下一个指针;

三、输出多项式时要从判断当不是头指针并且系数大于零时输出加号开始输出每一个多项

式,

四、多项式相加时要把特殊情况先处理掉,然后开始对不同情况分类讨论处理,而且要注意

当有一个为空而另一个不空时的情况;

五、在主函数中要给出充分的提示来保证有良好的I/O界面;

六、而且在每建立一个链表时都要把头指针置空以免出现不必要的麻烦;

七、该程序还是很冗长,在判别ne、nf都不为零时的语句也过长,在add函数中用了太多

选择判断语句,而且有很多重复的语句没提取出来。

【主要参考资料】

《面向对象程序设计基础》(第二版)

C++实验讲义

插值与拟合实验报告

学生实验报告

了解插值与拟合的基本原理和方法;掌握用MATLAB计算插值与作最小二乘多项式拟合和曲线拟合的方法;通过范例展现求解实际问题的初步建模过程; 通过动手作实验学习如何用插值与拟合方法解决实际问题,提高探索和解决问题的能力。这对于学生深入理解数学概念,掌握数学的思维方法,熟悉处理大量的工程计算问题的方法具有十分重要的意义。 二、实验仪器、设备或软件:电脑,MATLAB软件 三、实验内容 1.编写插值方法的函数M文件; 2.用MATLAB中的函数作函数的拟合图形; 3.针对实际问题,试建立数学模型,并求解。 四、实验步骤 1.开启软件平台——MATLAB,开启MATLAB编辑窗口; 2.根据各种数值解法步骤编写M文件; 3.保存文件并运行; 4.观察运行结果(数值或图形); 5.写出实验报告,并浅谈学习心得体会。 五、实验要求与任务 根据实验内容和步骤,完成以下具体实验,要求写出实验报告(实验目的→问题→数学模型→算法与编程→计算结果→分析、检验和结论→心得体会)。 1.天文学家在1914年8月的7次观测中,测得地球与金星之间距离(单位:米),并取得常用对数值,与日期的一组历史数据如下表: 由此推断何时金星与地球的距离(米)的对数值为9.93518? 解:输入命令

days=[18 20 22 24 26 28 30]; distancelogs=[9.96177 9.95436 9.94681 9.93910 9.93122 9.92319 9.91499]; t1=interp1(distancelogs,days,9.93518) %线性插值 t2=interp1(distancelogs,days,9.93518,'nearest') %最近邻点插值 t3=interp1(distancelogs,days,9.93518,'spline') %三次样条插值 t4=interp1(distancelogs,days,9.93518,'cubic') %三次插值 计算结果: t1 = 24.9949 t2 = 24 t3 = 25.0000 t4 =

插值法和拟合实验报告(数值计算)

插值法和拟合实验报告 一、 实验目的 1.通过进行不同类型的插值,比较各种插值的效果,明确各种插值的优越性; 2.通过比较不同次数的多项式拟合效果,了解多项式拟合的原理; 3.利用matlab 编程,学会matlab 命令; 4.掌握拉格朗日插值法; 5.掌握多项式拟合的特点和方法。 二、 实验题目 1.、插值法实验 将区间[-5,5]10等分,对下列函数分别计算插值节点 k x 的值,进行不同类型 的插值,作出插值函数的图形并与)(x f y =的图形进行比较: ;11)(2x x f += ;a r c t a n )(x x f = .1)(42 x x x f += (1) 做拉格朗日插值; (2) 做分段线性插值; (3) 做三次样条插值. 2、拟合实验 给定数据点如下表所示: 分别对上述数据作三次多项式和五次多项式拟合,并求平方误差,作出离散函数 ),(i i y x 和拟合函数的图形。 三、 实验原理 1.、插值法实验

∏∑∏∏∏∑∑≠==≠=≠=≠=+-==--= =-= ==-=-=----==++==j i j j i i i i i n i i n n j i j j n j i j j i i n j i j j n i i i n i i n n n o i n i i n x x x x x y x l x L x x c n i x x c x x x c x x x x x x x x c y x l x L y x l y x l y x l x L ,00 ,0,0,01100 00 )(l )()() (1 ,1,0, 1)()(l ) ()())(()()()()()()()(, 故, 得 再由,设 2、拟合实验

数据结构实验报告,一元多项式资料

数据结构课程设计报告

目录 一、任务目标,,,,,,,,,,,, 3 二、概要设计,,,,,,,,,,,, 4 三、详细设计,,,,,,,,,,,, 6 四、调试分析,,,,,,,,,,,, 8 五、源程序代码,,,,,,,,,, 8 六、程序运行效果图与说明,,,,, 15 七、本次实验小结,,,,,,,,, 16 八、参考文献,,,,,,,,,,, 16

任务目标 分析(1) a. 能够按照指数降序排列建立并输出多项式 b.能够完成两个多项式的相加,相减,并将结果输入要求:程序所能达到的功能: a.实现一元多项式的输入; b.实现一元多项式的输出; c.计算两个一元多项式的和并输出结果; d.计算两个一元多项式的差并输出结果;除任务要求外新增乘法: 计算两个一元多项式的乘积并输出结果 (2)输入的形式和输入值的范围:输入要求:分行输入,每行输入一项,先输入多项式的指数,再输入多项式的系数,以0 0 为结束标志,结束一个多项式的输入。 输入形式: 2 3 -1 2 3 0 1 2 0 0 输入值的范围:系数为int 型,指数为float 型 3)输出的形式: 第一行输出多项式1; 第二行输出多项式2; 第三行输出多项式 1 与多项式 2 相加的结果多项式; 第四行输出多项式 1 与多项式 2 相减的结果多项式;第五行输出多项式 1 与多项式 2 相乘的结果多项式 二、概要设计 程序实现 a. 功能:将要进行运算的二项式输入输出;

b. 数据流入:要输入的二项式的系数与指数; c.数据流出:合并同类项后的二项式; d.程序流程图:二项式输入流程图; e.测试要点:输入的二项式是否正确,若输入错误则重新输入

数值分析拉格朗日插值法上机实验报告

课题一:拉格朗日插值法 1.实验目的 1.学习和掌握拉格朗日插值多项式。 2.运用拉格朗日插值多项式进行计算。 2.实验过程 作出插值点(1.00,0.00),(-1.00,-3.00),(2.00,4.00)二、算法步骤 已知:某些点的坐标以及点数。 输入:条件点数以及这些点的坐标。 输出:根据给定的点求出其对应的拉格朗日插值多项式的值。 3.程序流程: (1)输入已知点的个数; (2)分别输入已知点的X坐标; (3)分别输入已知点的Y坐标; 程序如下: #include #include #include float lagrange(float *x,float *y,float xx,int n) /*拉格朗日

插值算法*/ { int i,j; float *a,yy=0.0; /*a作为临时变量,记录拉格朗日插值多项*/ a=(float*)malloc(n*sizeof(float)); for(i=0;i<=n-1;i++) { a[i]=y[i]; for(j=0;j<=n-1;j++) if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]); yy+=a[i]; } free(a); return yy; } int main() { int i; int n; float x[20],y[20],xx,yy; printf("Input n:");

scanf("%d",&n); if(n<=0) { printf("Error! The value of n must in (0,20)."); getch();return 1; } for(i=0;i<=n-1;i++) { printf("x[%d]:",i); scanf("%f",&x[i]); } printf("\n"); for(i=0;i<=n-1;i++) { printf("y[%d]:",i);scanf("%f",&y[i]); } printf("\n"); printf("Input xx:"); scanf("%f",&xx); yy=lagrange(x,y,xx,n); printf("x=%f,y=%f\n",xx,yy); getch(); } 举例如下:已知当x=1,-1,2时f(x)=0,-3,4,求f(1.5)的值。

数值分析实验插值与拟合

《数值分析》课程实验一:插值与拟合 一、实验目的 1. 理解插值的基本原理,掌握多项式插值的概念、存在唯一性; 2. 编写MA TLAB 程序实现Lagrange 插值和Newton 插值,验证Runge 现象; 3. 通过比较不同次数的多项式拟合效果,理解多项式拟合的基本原理; 4. 编写MA TLAB 程序实现最小二乘多项式曲线拟合。 二、实验内容 1. 用Lagrange 插值和Newton 插值找经过点(-3, -1), (0, 2), (3, -2), (6, 10)的三次插值公式,并编写MATLAB 程序绘制出三次插值公式的图形。 2. 设 ]5,5[,11 )(2 -∈+= x x x f 如果用等距节点x i = -5 + 10i /n (i = 0, 1, 2, …, n )上的Lagrange 插值多项式L n (x )去逼近它。不妨取n = 5和n = 10,编写MATLAB 程序绘制出L 5(x )和L 10(x )的图像。 (2) 编写MA TLAB 程序绘制出曲线拟合图。 三、实验步骤 1. (1) Lagrange 插值法:在线性空间P n 中找到满足条件: ?? ?≠===j i j i x l ij j i , 0,, 1)(δ 的一组基函数{}n i i x l 0)(=,l i (x )的表达式为 ∏ ≠==--= n i j j j i j i n i x x x x x l ,0),,1,0()( 有了基函数{}n i i x l 0)(=,n 次插值多项式就可表示为 ∑==n i i i n x l y x L 0 )()( (2) Newton 插值法:设x 0, x 1, …, x n 是一组互异的节点,y i = f (x i ) (i = 0, 1, 2, …, n ),f (x )在处的n 阶差商定义为

插值法实验报告

实验二插值法 1、实验目的: 1、掌握直接利用拉格郎日插值多项式计算函数在已知点的函数值;观察拉格郎日插值的龙格现象。 2、了解Hermite插值法、三次样条插值法原理,结合计算公式,确定函数值。 2、实验要求: 1)认真分析题目的条件和要求,复习相关的理论知识,选择适当的解决方案和算法; 2)编写上机实验程序,作好上机前的准备工作; 3)上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果); 4)分析和解释计算结果; 5)按照要求书写实验报告; 3、实验内容: 1) 用拉格郎日插值公式确定函数值;对函数f(x)进行拉格郎日插值,并对f(x)与插值多项式的曲线作比较。 已知函数表:(0.56160,0.82741)、(0.56280,0.82659)、(0.56401,0.82577)、(0.56521,0.82495)用三次拉格朗日插值多项式求x=0.5635时函数近似值。 2) 求满足插值条件的插值多项式及余项 1) 4、题目:插值法 5、原理: 拉格郎日插值原理: n次拉格朗日插值多项式为:L n (x)=y l (x)+y 1 l 1 (x)+y 2 l 2 (x)+…+y n l n (x)

n=1时,称为线性插值, L 1(x)=y (x-x 1 )/(x -x 1 )+y 1 (x-x )/(x 1 -x )=y +(y 1 -x )(x-x )/(x 1 -x ) n=2时,称为二次插值或抛物线插值, L 2(x)=y (x-x 1 )(x-x 2 )/(x -x 1 )/(x -x 2 )+y 1 (x-x )(x-x 2 )/(x 1 -x )/(x 1 -x 2 )+y 2 (x -x 0)(x-x 1 )/(x 2 -x )/(x 2 -x 1 ) n=i时, Li= (X-X0)……(X-X i-1)(x-x i+1) ……(x-x n) (X-X0)……(X-X i-1)(x-x i+1) ……(x-x n) 6、设计思想: 拉格朗日插值法是根据n + 1个点x0, x1, ... x n(x0 < x1 < ... x n)的函数值f (x0), f (x1) , ... , f (x n)推出n次多項式p(x),然后n次多項式p (x)求出任意的点x对应的函数值f (x)的算法。 7、对应程序: 1 ) 三次拉格朗日插值多项式求x=0.5635时函数近似值 #include"stdio.h" #define n 5 void main() { int i,j; float x[n],y[n]; float x1; float a=1; float b=1; float lx=0; printf("\n请输入想要求解的X:\n x="); scanf("%f",&x1); printf("请输入所有点的横纵坐标:\n"); for(i=1;i

插值法数值上机实验报告

插值法数值上机实验报告 实验题目: 利用下列条件做插值逼近,并与R (x) 的图像比较 考虑函数:R x y=1 1+x2 (1)用等距节点X i=?5+i,i=0,1,...,10.给出它的10次Newton插值多项式的图像; π),i=0,1,...,20.给出它的20次Lagrange插值多项式(2)用节点X i=5cos(2i+1 42 的图像; (3)用等距节点X i=?5+i,i=0,1,...,10.给出它的分段线性插值函数的图像;(4)用等距节点X i=?5+i,i=0,1,...,10.给出它的三次自然样条插值函数的图像; (5)用等距节点X i=?5+i,i=0,1,...,10.给出它的分段三次Hermite插值函数的图像; 实验图像结果:

实验结果分析: 1.为了验证Range现象,我还特意做了10次牛顿插值多项式和20次牛顿插值多项式的对比图像,结果如下图(图对称,只截取一半) 可以看出,Range现象在高次时变得更加明显。这也是由于高次多项式在端点处的最值随次数的变大很明显。可以料定高次多项式在两侧端点处剧烈震荡,在更小的间距内急剧上升然后下降,Range现象非常明显。

2.分析实验(2)的结果,我们会惊讶地发现,由于取21个点逼近,原本预料的Range现象会很明显,但这里却和f(x)拟合的很好。(即下图中Lagrange p(x)的图像)。可是上图中取均匀节点的20次牛顿多项式逼近的效果在端点处却很差。料想是由于节点X i=5cos2i+1 42 π ,i=0,1,...,20 取得很好。由书上第五章的 知识,对于函数y=1 1+x ,y 1 2对应的cherbyshev多项式的根恰好为X i= 5cos2i+1 42 π ,i=0,1,...,20 。由于所学限制,未能深入分析。 (3)比较三次样条插值图像和Hermit插值图像对原函数图像的逼近情形。见下图:

C++一元多项式合并实验报告

实验二一元多项式相加问题本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。 一、问题描述 一元多项式相加是通过键盘输入两个形如P 0+P 1 X1+P 2 X2+···+PnX n的多项式,经过程序运算后在屏幕上输出它 们的相加和。 二、数据结构设计 分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数—指数”两部分组成,所以可将它抽象成一个由“系数—指数对”构成线性表,由于对多项式中系数为0的子项可以不记录他的数值,对于这样的情况就不再付出存储空间来存放它了。基于这样的分析,可以采取一个带有头结点的单链表来表示一个一元多项式。具体数据结构定义为: typedef struct node { float ce; //系数域 float ex; //指数域 struct node *next; //指针域 }lnode,*linklist; 三功能(函数)设计 1、输入并建立多项式的功能模块 此模块要求按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项的“系数—指数对”,输入一个子项建立一个相关的节点,当遇到输入结束标志时结束输入,而转去执行程序下面的部分。 屏幕提示: input ce & ex and end with 0: ce=1 ex=2 ce=0 ex=0 //输入结束标志 input ce & ex and end with 0: ce=2 ex=2 ce=0 ex=0 //输入结束标志 输入后程序将分别建立两个链表来描述两个一元多项式: A=X^2 B=2X^2 这两个多项式的相加的结果应该为: C=3X^2 2、多项式相加的功能模块 此模块根据在1中建立的两个多项式进行相加运算,并存放在以C为头指针的一个新建表中。可以采用以下方法进行设计: 开始时a,b分别指向A,B的开头,如果ab不为空,进行判断:如果a所指的结点的指数和b所指的结点的指数相同,将它们的系数相加做成C式中的一项,如果不一样则将小的一项加到C中。 if(a->ex==b->ex) //判断指数是否相等 {s->ce=a->ce+b->ce; if(s->ce!=0) s->ex=a->ex; else delete s; a=a->next; b=b->next; }

插值与拟合实验报告

一、给定函数y=sinx的函数表如下表,用拉格朗日插值求sin0.57891的近似 值 M文件: function yh=lagrange2(x0,y0,xh) n = length(x0); m = length(xh); yh=zeros(1,m); for k = 1:m for i = 1:n xp = x0([1:i-1 i+1:n]); yp = prod((xh(k)-xp)./(x0(i)-xp)); yh(k) = yh(k) + yp*y0(i); end end 执行:>> x0=[0.4,0.5,0.6,0.7] x0 = 0.4000 0.5000 0.6000 0.7000 >> y0=[0.38942,0.47943,0.56464,0.64422] y0 = 0.3894 0.4794 0.5646 0.6442 >> lagrange2(x0,y0,0.57891) 执行结果: ans = 0.5471

二、 1. 给定sin110.190809,sin120.207912,sin130.224951,o o o ===构造牛顿 插值函数计算'sin1130o 。 M 文件: function fp = newpoly(x,y,p) n = length(x); a(1) = y(1); for k = 1 : n - 1 d(k, 1) = (y(k+1) - y(k))/(x(k+1) - x(k)); end for j = 2 : n - 1 for k = 1 : n - j d(k, j) = (d(k+1, j - 1) - d(k, j - 1))/(x(k+j) - x(k)); end end d for j = 2 : n a(j) = d(1, j-1); end Df(1) = 1; c(1) = a(1); for j = 2 : n Df(j)=(p - x(j-1)) .* Df(j-1); c(j) = a(j) .* Df(j);

链表实现多项式相加实验报告

实验报告 课程名称:数据结构 题目:链表实现多项式相加 班级: 学号: 姓名: 完成时间:2012年10月17日

1、实验目的和要求 1)掌握链表的运用方法; 2)学习链表的初始化并建立一个新的链表; 3)知道如何实现链表的插入结点与删除结点操作; 4)了解链表的基本操作并灵活运用 2、实验内容 1)建立两个链表存储一元多项式; 2)实现两个一元多项式的相加; 3)输出两个多项式相加后得到的一元多项式。 3、算法基本思想 数降序存入两个链表中,将大小较大的链表作为相加后的链表寄存处。定义两个临时链表节点指针p,q,分别指向两个链表头结点。然后将另一个链表中从头结点开始依次与第一个链表比较,如果其指数比第一个小,则p向后移动一个单位,如相等,则将两节点的系数相加作为第一个链表当前节点的系数,如果为0,则将此节点栓掉。若果较大,则在p前插入q,q向后移动一个,直到两个链表做完为止。 4、算法描述 用链表实现多项式相加的程序如下: #include #include #include struct node{ int exp; float coef; struct node*next; };

void add_node(struct node*h1,struct node*h2); void print_node(struct node*h); struct node*init_node() { struct node*h=(struct node*)malloc(sizeof(struct node)),*p,*q; int exp; float coef=1.0; h->next=NULL; printf("请依次输入多项式的系数和指数(如:\"2 3\";输入\"0 0\"时结束):\n"); p=(struct node*)malloc(sizeof(struct node)); q=(struct node*)malloc(sizeof(struct node)); for(;fabs(coef-0.0)>1.0e-6;) { scanf("%f %d",&coef,&exp); if(fabs(coef-0.0)>1.0e-6) { q->next=p; p->coef=coef; p->exp=exp; p->next=NULL; add_node(h,q); } } free(p); free(q); return(h); } void add_node(struct node*h1,struct node*h2) { struct node*y1=h1,*y2=h2; struct node*p,*q; y1=y1->next; y2=y2->next; for(;y1||y2;) if(y1) { if(y2) { if(y1->expexp) y1=y1->next; else if(y1->exp==y2->exp) { y1->coef+=y2->coef; if(y1->coef==0)

实验四 插值法与曲线拟合

计算方法实验报告 专业班级:医学信息工程一班姓名:陈小芳学号:201612203501002 实验成绩: 1.【实验题目】 插值法与曲线拟合 2.【实验目的】 3.【实验内容】 4. 【实验要求】

5. 【源程序(带注释)】 (1)拉格朗日插值 #include #include #include #include #include #define n 4 //插值节点的最大下标 main() { double x1[n+1]={0.4,0.55,0.65,0.8,0.9}; double y1[n+1]={0.4175,0.57815,0.69657,0.88811,1.02652}; double Lagrange(double x1[n+1],double y1[n+1],float t); int m,k;float x,y;float X;double z; printf("\n The number of the interpolation points is m ="); //输入插值点的个数 while(!scanf("%d",&m)) { fflush(stdin); printf("\n输入错误,请重新输入:\n"); printf("\n The number of the interpolation points is m ="); } for(k=1;k<=m;k++) { printf("\ninput X%d=",k); while(!scanf("%f",&X)) { fflush(stdin); printf("\n输入错误,请重新输入:\n"); printf("\ninput X%d=",k); } z=Lagrange(x1,y1,X); printf("P(%f)=%f\n",X,z); } getch(); return (0); } double Lagrange(double x[n+1],double y[n+1],float X) { int i,j;

用多项式模型进行数据拟合实验报告(附代码)

实验题目: 用多项式模型进行数据拟合实验 1 实验目的 本实验使用多项式模型对数据进行拟合,目的在于: (1)掌握数据拟合的基本原理,学会使用数学的方法来判定数据拟合的情况; (2)掌握最小二乘法的基本原理及计算方法; (3)熟悉使用matlab 进行算法的实现。 2 实验步骤 2.1 算法原理 所谓拟合是指寻找一条平滑的曲线,最不失真地去表现测量数据。反过来说,对测量 的实验数据,要对其进行公式化处理,用计算方法构造函数来近似表达数据的函数关系。由于函数构造方法的不同,有许多的逼近方法,工程中常用最小平方逼近(最小二乘法理论)来实现曲线的拟合。 最小二乘拟合利用已知的数据得出一条直线或曲线,使之在坐标系上与已知数据之间的距离的平方和最小。模型主要有:1.直线型2.多项式型3.分数函数型4.指数函数型5.对数线性型6.高斯函数型等,根据应用情况,选用不同的拟合模型。其中多项式型拟合模型应用比较广泛。 给定一组测量数据()i i y x ,,其中m i ,,3,2,1,0Λ=,共m+1个数据点,取多项式P (x ),使得 min )]([020 2=-=∑∑==m i i i m i i y x p r ,则称函数P (x )为拟合函数或最小二乘解,此时,令 ∑==n k k k n x a x p 0 )(,使得min ])([02 002=??? ? ??-=-=∑∑∑===m i n k i k i k m i i i n y x a y x p I ,其中 n a a a a ,,,,210Λ为待求的未知数,n 为多项式的最高次幂,由此该问题化为求),,,(210n a a a a I I Λ=的极值问题。 由多元函数求极值的必要条件:0)(200 =-=??∑∑==m i j i n k i k i k i x y x a a I ,其中n j ,,2,1,0Λ= 得到: ∑∑∑===+=n k m i i j i k m i k j i y x a x )(,其中n j ,,2,1,0Λ=,这是一个关于n a a a a ,,,,210Λ的线 性方程组,用矩阵表示如下所示:

一元多项式相加完整实验报告

一元多项式相加实验报告 一元多项式的相加

一实验内容 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 二需求分析 1掌握线性结构的逻辑特性和物理特性。 2建立一元多项式。 3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。 4能够完成两个多项式的加减运算,并输出结果。 三概要设计 1 本程序所用到的抽象数据类型: typedef OrderedLinkList polynomial; // 用带表头结点的有序链表表示多项式 结点的数据元素类型定义为: typedef struct { // 项的表示 float coef; // 系数 int expn; // 指数 term, ElemType; V oid AddPolyn(polynomail&Pa,polynomail&Pb) Position GetHead() Position NextPos(LinkList L,Link p) Elem GetCurElem(Link p) int cmp(term a term b) Status SetCurElem(Link&p, ElemType e) Status DelFirst(Link h, Link &q) Status ListEmpty(LinkList L) Status Append(LinkList&L, Link S) FreeNode() 2 存储结构

一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。 创建一元多项式链表,对运算中可能出现的各种情况进行分析,实现一元多项式的相加相减操作。 3 模块划分 a) 主程序;2)初始化单链表;3)建立单链表; 4)相加多项式 4 主程序流程图 四详细设计 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对

数学实验-实验2 插值与拟合

广州大学学生实验报告 开课学院及实验室: 2014年 月 日 学院 数学与信息科学学院 年级、专业、班 姓名 学号 实验课程名称 数学实验 成绩 实验项目名称 实验2 插值与拟合 指导老师 一、实验目的 1、掌握用MATLAB 计算拉格朗日、分段线性、三次样条三种插值的方法,改变节点的数目,对三种插值结果进行初步分析。 2、掌握用MATLAB 作线性最小二乘拟合的方法。 3、通过实例学习如何用插值方法与拟合方法解决实际问题,注意二者的联系和区别。 二、实验设备 电脑、MATLAB 三、实验要求 1..选择一些函数,在n 个节点上(n )不要太大,如5~11)用拉格朗日,分段线性,三次样条三种插值方法,,计算m 各插值点的函数值(m 要适中,如50~100).通过数值和图形的输出,将三种插值结果与精确值进行比较.适当增加n ,再作比较,由此作初步分析.下列函数供选择参考: a. y=sin x ,0≦x ≦2π; 2.用 1 2 y x =在x=0,1,4,9,16产生5个节点15,...,P P .用不同的节点构造插值公式来计算x=5处的插值(如用 15,...,P P ;14,...,P P ;24,...,P P 等)与精确值比较进行分析。 5.对于实验1中的录像机计数器,自己实测一组数据(或利用给出的数据),确定模型2 t an bn =+中的系数a,b. 6.用电压V=10伏的电池给电容器充电,电容器上t 时刻的电压为 0()()t v t V V V e -τ =--,其中 0V 是电容器的初始 电压,τ是充电常数。试由下面一组t ,V 数据确定0V 和τ. t/s 0.5 1 2 3 4 5 7 9 V/V 6.36 6.48 7.26 8.22 8.66 8.99 9.43 9.63 8. 弹簧在力F 的作用下伸长x ,一定范围内服从胡克定律:F 与x 成正比,即F=kx,k 为弹性系数.现在得到下面一组x ,F 数据,并在(x,F )坐标下作图(图13).可以看出,当F大到一定数值(如x=9以后)后,就不服从这个定律了。试由数据拟合直线F=kx,并给出不服从胡克定律时的近似公式(曲线)。 1)要求直线与曲线在x=9处相连接。 2)要求直线与曲线在x=9处光滑连接. 四、实验程序 预备: function y=lagr1(x0,y0,x) n=length(x0);m=length(x); for i=1:m z=x(i); s=0.0; for k=1:n p=1.0; for j=1:n if j~=k p=p*(z-x0(j))/(x0(k)-x0(j)); end end s=s+p*y0(k); end y(i)=s; end 五、实验操作过程 当n=5时 clear; n=5; %在n 个节点上进行插值 m=75; %产生m 个插值点,计算函数在插值点处的精确值,将来进行对比 x=0:4/(m-1):2*pi; y=sin(x); z=0*x; x0=0:4/(n-1):2*pi; y0=sin(x0); y1=lagr1(x0,y0,x); % y1为拉格朗日插值 y2=interp1(x0,y0,x); % y2为分段线性插值 y3=spline(x0,y0,x); % y3为三次样条插值 [x' y' y1' y2' y3'] plot(x,z,'k',x,y,'r:',x,y1,'g-.',x,y2,'b',x,y3,'y--') gtext('Lagr.'), gtext('Pieces. linear'), gtext('Spline'), gtext('y=sin(x)') hold off; %比较插值所得结果与函数在插值点处的精确值 s = ' x y y1 y2 y3' [x' y' y1' y2' y3'] 结果 ans = 0 0 0 0 0 0.0541 0.0540 0.0495 0.0455 0.0611 0.1081 0.1079 0.0999 0.0910 0.1207 0.1622 0.1615 0.1510 0.1365 0.1787 0.2162 0.2145 0.2025 0.1819 0.2350 0.2703 0.2670 0.2541 0.2274 0.2896 0.3243 0.3187 0.3054 0.2729 0.3425 0.3784 0.3694 0.3563 0.3184 0.3936 0.4324 0.4191 0.4066 0.3639 0.4429 0.4865 0.4675 0.4559 0.4094 0.4904 0.5405 0.5146 0.5040 0.4548 0.5359 0.5946 0.5602 0.5508 0.5003 0.5796 0.6486 0.6041 0.5961 0.5458 0.6212 0.7027 0.6463 0.6396 0.5913 0.6609 0.7568 0.6866 0.6812 0.6368 0.6985 0.8108 0.7248 0.7208 0.6823 0.7341 0.8649 0.7610 0.7583 0.7278 0.7675

一元多项式的运算

数据结构课程设计实验报告 专业班级: 学号: 姓名: 2011年1月1日

题目:一元多项式的运算 1、题目描述 一元多项式的运算在此题中实现加、减法的运算,而多项式的减法可以通过加法来实现(只需在减法运算时系数前加负号)。 在数学上,一个一元n次多项式P n(X)可按降序写成: P n(X)= P n X^n+ P(n-1)X^(n-1)+......+ P1X+P0 它由n+1个系数惟一确定,因此,在计算机里它可以用一个线性表P来表示: P=(P n,P(n-1),......,P1,P0) 每一项的指数i隐含在其系数P i的序号里。 假设Q m(X)是一元m次多项式,同样可以用一个线性表Q来表示: Q=(q m,q(m-1),.....,q1,q0) 不是一般性,假设吗吗m

实验报告五 插值

浙江大学城市学院实验报告 课程名称 科学计算 实验项目名称 函数的数值逼近-插值 实验成绩 指导老师(签名 ) 日期 一. 实验目的和要求 1. 掌握用Matlab 计算Lagrange 、分段线性、三次样条三种插值的方法,改变节点的数目, 对三种插值结果进行初步分析。 2. 通过实例学习如何用插值方法解决实际问题。 二. 实验内容和原理 1) 编程题2-1要求写出Matlab 源程序(m 文件),并对每一行语句加上适当的注释语句; 2) 分析应用题2-2,2-3,2-4,2-5要求将问题的分析过程、Matlab 源程序、运行结果和结 果的解释、算法的分析等写在实验报告上。 2-1 编程 编写Lagrange 插值函数的Matlab 程序,其中n 个插值节点以数组0x ,0y 输入,m 个待求点的自变量以数组x 输入。输出数组y 为m 个待求点的函数值。 Lagrange 插值:=lagr(0,0,)y x y x Step 1 输入插值节点数组0x ,0y 和待求节点x ; Step 2 数组0x 的长度为n ,x 的长度为m ; Step 3 对1,2, ,i n =,构造第i 个插值基函数 111111(0)(0)(0)(0) ()(00)(00)(00)(00) i i n i i i i i i i n x x x x x x x x l x x x x x x x x x -+-+----= ---- 并计算在m 个待求点上的基函数值。 Step 4 根据公式1 0()n i i i y y l x == ∑分别计算m 个待求点上的函数值。 并对程序的每一行语句加上适当的注释语句。

两个一元多项式相加-c++版

《数据结构》实验报告 ——两个一元多项式相加 一、实验题目:两个一元多项式相加 二、实验内容: 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 三、设计思想: (1)建立两个顺序列表,分别用来表示两个一元多项式;顺序列表奇数位,存储该多项式的系数;顺序列表的偶数位,存储该相应多项式的指数。 (2)用成员函数merg(qList&l2)实现两多项式的相加。实现的大致方法为:比较第二个多项式列表与第一个多项式列表的偶数位的数值大小(指数),如果 相同,则将他们的前一位数(系数)相加;如果不同,就将他的前一位数(系 数)及它自己(指数)插入第一个多项式列表的后面。 (3)建立函数shu(double a[],int j)实现多项式的输入。 四、源程序代码 #include "stdafx.h" #include using namespace std; template class List { private: Telem * elem; int curlen; int maxlen; public: List(int maxsz=100):maxlen(maxsz) { curlen=0; elem=new Telem{maxlen}; }; List(Telem a[],int n,int maxsz=100):maxlen(maxsz) { curlen=n; elem=new Telem[maxlen]; for(int i=0;i

[计算机]一元多项式相加完整实验报告

[计算机]一元多项式相加完整实验报告一元多项式的相加 一实验内容 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 二需求分析 1掌握线性结构的逻辑特性和物理特性。 2建立一元多项式。 3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。 4能够完成两个多项式的加减运算,并输出结果。 三概要设计 1 本程序所用到的抽象数据类型: typedef OrderedLinkList polynomial; // 用带表头结点的有序链表表示多项式 结点的数据元素类型定义为: typedef struct { // 项的表示 oat flcoef; // 系数 int expn; // 指数 term, ElemType; Void AddPolyn(polynomail&Pa,polynomail&Pb) Position GetHead() Position NextPos(LinkList L,Link p) Elem GetCurElem(Link p) int cmp(term a term b)

Status SetCurElem(Link&p, ElemType e) Status DelFirst(Link h, Link &q) Status ListEmpty(LinkList L) Status Append(LinkList&L, Link S) FreeNode() 2 存储结构 一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。 序数coef 指数exp 指针域next 创建一元多项式链表,对运算中可能出现的各种情况进行分析,实现一元多项式的相加相减操作。 3 模块划分 a) 主程序;2)初始化单链表;3)建立单链表; 4)相加多项式 4 主程序流程图 开始 申请结点空间 输入多项式各项的系数X,指数Y 输出已输出的多项式 否 是否输入正确 合并同类项 结束 四详细设计 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相

matlab 软件拟合与插值运算实验报告

实验6 数据拟合&插值 一.实验目的 学会MATLAB软件中软件拟合与插值运算的方法。 二.实验内容与要求 在生产和科学实验中,自变量x与因变量y=f(x)的关系式有时不能直接写出表达式,而只能得到函数在若干个点的函数值或导数值。当要求知道观测点之外的函数值时,需要估计函数值在该点的值。 要根据观测点的值,构造一个比较简单的函数y=t (x),使函数在观测点的值等于已知的数值或导数值,寻找这样的函数t(x),办法是很多的。 根据测量数据的类型有如下两种处理观测数据的方法。 (1)测量值是准确的,没有误差,一般用插值。 (2)测量值与真实值有误差,一般用曲线拟合。 MATLAB中提供了众多的数据处理命令,有插值命令,拟合命令。 1.曲线拟合 >> x=[0.5,1.0,1.5,2.0,2.5,3.0]; >> y=[1.75,2.45,3.81,4.80,7.00,8.60]; >> p=polyfit (x,y,2); >> x1=0.5:0.05:3.0; >> y1=polyval(p,x1 ); >> plot(x,y,'*r',x1,y1,'-b')

2.一维插值 >> year=[1900,1910,1920,1930,1940,1990,2000,2010]; >> product = [75.995,91.972,105.711,123.203,131.669,249.633,256.344,267.893 ]; >> p2005=interp1(year,product,2005) p2005 = 262.1185 >> y= interp1(year,product,x, 'cubic'); >> plot(year,product,'o',x,y)

相关主题
文本预览
相关文档 最新文档