数值分析 C语言 代码

合集下载

线性方程组的数值算法C语言实现(附代码)

线性方程组的数值算法C语言实现(附代码)

线性方程组AX=B 的数值计算方法实验一、 实验描述:随着科学技术的发展,线性代数作为高等数学的一个重要组成部分,在科学实践中得到广泛的应用。

本实验的通过C 语言的算法设计以及编程,来实现高斯消元法、三角分解法和解线性方程组的迭代法(雅可比迭代法和高斯-赛德尔迭代法),对指定方程组进行求解。

二、 实验原理:1、高斯消去法:运用高斯消去法解方程组,通常会用到初等变换,以此来得到与原系数矩阵等价的系数矩阵,达到消元的目的。

初等变换有三种:(a)、(交换变换)对调方程组两行;(b)、用非零常数乘以方程组的某一行;(c)、将方程组的某一行乘以一个非零常数,再加到另一行。

通常利用(c),即用一个方程乘以一个常数,再减去另一个方程来置换另一个方程。

在方程组的增广矩阵中用类似的变换,可以化简系数矩阵,求出其中一个解,然后利用回代法,就可以解出所有的解。

2、选主元:若在解方程组过程中,系数矩阵上的对角元素为零的话,会导致解出的结果不正确。

所以在解方程组过程中要避免此种情况的出现,这就需要选择行的判定条件。

经过行变换,使矩阵对角元素均不为零。

这个过程称为选主元。

选主元分平凡选主元和偏序选主元两种。

平凡选主元:如果()0p pp a ≠,不交换行;如果()0p pp a =,寻找第p 行下满足()0p pp a ≠的第一行,设行数为k ,然后交换第k 行和第p 行。

这样新主元就是非零主元。

偏序选主元:为了减小误差的传播,偏序选主元策略首先检查位于主对角线或主对角线下方第p 列的所有元素,确定行k ,它的元素绝对值最大。

然后如果k p >,则交换第k 行和第p 行。

通常用偏序选主元,可以减小计算误差。

3、三角分解法:由于求解上三角或下三角线性方程组很容易所以在解线性方程组时,可将系数矩阵分解为下三角矩阵和上三角矩阵。

其中下三角矩阵的主对角线为1,上三角矩阵的对角线元素非零。

有如下定理:如果非奇异矩阵A 可表示为下三角矩阵L 和上三角矩阵U 的乘积: A LU = (1) 则A 存在一个三角分解。

c语言计算的代码

c语言计算的代码

c语言计算的代码#include <stdio.h>// 定义一个函数,用于计算两个数的和int sum(int a, int b) {return a + b;}// 定义一个函数,用于计算两个数的差int subtract(int a, int b) {return a - b;}// 定义一个函数,用于计算两个数的积int multiply(int a, int b) {return a * b;}// 定义一个函数,用于计算两个数的商float divide(int a, int b) {if (b == 0) {printf("除数不能为0。

\n");return 0;} else {return (float)a / b;}}int main() {int num1, num2;printf("请输入两个整数:\n");scanf("%d %d", &num1, &num2);printf("两个数的和:%d\n", sum(num1, num2));printf("两个数的差:%d\n", subtract(num1, num2));printf("两个数的积:%d\n", multiply(num1, num2));printf("两个数的商:%f\n", divide(num1, num2));return 0;}这是一个C语言程序,用于计算两个数的和、差、积和商。

程序先通过输入函数`scanf`获取用户输入的两个整数,并分别保存到`num1`和`num2`变量中。

然后调用自定义的计算函数`sum`、`subtract`、`multiply`和`divide`分别进行加法、减法、乘法和除法运算,并通过`printf`语句将计算结果输出给用户。

数值分析Runge现象计算实验

数值分析Runge现象计算实验

数值分析实验报告(02)一、实验目的通过上机绘制Runge 函数图像,理解高次插值的病态性质。

二、实验内容在区间[-1,1]上分别取n=10,n=20用两组等距节点对龙格(Runge)函数21()125f x x =+作多项式插值,对每个n 值分别画出()f x 和插值函数的图形。

三、编程思路(相关背景知识、算法步骤、流程图、伪代码)四、程序代码(Matlab 或C 语言的程序代码)function yt=Untitled8(x,y,xt)%UNTITLED5 ´Ë´¦ÏÔʾÓйش˺¯ÊýµÄÕªÒª% ´Ë´¦ÏÔʾÏêϸ˵Ã÷n=length(x);ny=length(y);if n~=nyerror('²åÖµ½ÚµãxÓ뺯ÊýÖµy²»Ò»ÖÂ');endm=length(xt);yt=zeros(1,m);for k=1:nlk=ones(1,m);for j=1:nif j~=klk=lk.*(xt-x(j))/(x(k)-x(j));endend ;yt=yt+y(k)*lk;endn=input('n=');x=linspace(-1,1,n);y=1./(1+25.*x.^2);xf=linspace(-1,1,100);yf=1./(1+25.*xf.^2)xl=xf;yl=Untitled8(x,y,xf);plot(xf,yf,'-b',xl,yl,'-r')五、数值结果及分析(数值运行结果及对结果的分析)当n=10时当n=20六、实验体会(计算中出现的问题,解决方法,实验体会)出现符号错误,代码函数变量不明重新输入,查询错误,找到并改正编码需要认真仔细,一定要头脑清晰,避免出现一些低级错误。

C语言基础简单的数学运算的代码

C语言基础简单的数学运算的代码

C语言基础简单的数学运算的代码#include <stdio.h>int main() {// 定义并初始化变量int num1 = 10;int num2 = 5;// 加法运算int sum = num1 + num2;printf("加法运算结果:%d\n", sum);// 减法运算int difference = num1 - num2;printf("减法运算结果:%d\n", difference);// 乘法运算int product = num1 * num2;printf("乘法运算结果:%d\n", product);// 除法运算float quotient = (float)num1 / num2;printf("除法运算结果:%.2f\n", quotient);// 求余运算int remainder = num1 % num2;printf("求余运算结果:%d\n", remainder);return 0;}以上是一个简单的C语言程序,实现了基本的数学运算功能。

程序运行后,会输出每个数学运算的结果。

接下来我会逐行解释代码的含义和执行过程。

首先,在程序的开头我们使用了#include <stdio.h>这行代码,这是为了包含C语言标准库中的输入输出函数,以便后续可以使用printf()函数打印结果。

接着,在main()函数中,我们定义并初始化了两个整型变量num1和num2,分别赋值为10和5。

这两个变量代表了我们要进行数学运算的两个操作数。

然后,我们使用加法运算将num1和num2相加得到sum,并使用printf()函数打印出加法运算的结果。

接着,我们使用减法运算将num1减去num2得到difference,并使用printf()函数打印出减法运算的结果。

c语言基础代码

c语言基础代码

c语言基础代码C语言基础代码引言:C语言是一种通用的、面向过程的编程语言,具有高效性和灵活性,被广泛应用于开发操作系统、嵌入式系统和各种应用程序。

了解C语言的基础代码对于学习和理解程序设计非常重要。

本文将介绍C语言的基础代码,包括变量和数据类型、运算符、控制语句和函数等内容。

一、变量和数据类型在C语言中,变量是用来存储数据的容器,而数据类型则决定了变量可以存储的数据的范围和格式。

C语言提供了几种基本的数据类型,包括整型、浮点型、字符型和指针型等。

下面是一些基本的变量声明和初始化的代码示例:1. 整型变量声明和初始化:```cint num1; // 声明一个整型变量int num2 = 10; // 声明并初始化一个整型变量,赋值为10```2. 浮点型变量声明和初始化:```cfloat pi = 3.14; // 声明并初始化一个浮点型变量,赋值为3.14double e = 2.71828; // 声明并初始化一个双精度浮点型变量,赋值为2.71828```3. 字符型变量声明和初始化:```cchar ch = 'A'; // 声明并初始化一个字符型变量,赋值为'A'```4. 指针变量声明和初始化:```cint *ptr = NULL; // 声明并初始化一个指向整型变量的指针变量,赋值为NULL(空指针)```二、运算符C语言提供了多种运算符,用于进行算术运算、逻辑运算、比较运算等。

下面是一些常见的运算符的代码示例:1. 算术运算符:```cint num1 = 10, num2 = 5;int sum = num1 + num2; // 加法运算,sum的值为15int diff = num1 - num2; // 减法运算,diff的值为5int product = num1 * num2; // 乘法运算,product的值为50float quotient = (float)num1 / num2; // 除法运算,quotient的值为2.0int remainder = num1 % num2; // 取余运算,remainder的值为0```2. 关系运算符:```cint num1 = 10, num2 = 5;int result1 = num1 > num2; // 大于运算,result1的值为1(真)int result2 = num1 < num2; // 小于运算,result2的值为0(假)int result3 = num1 == num2; // 等于运算,result3的值为0(假)int result4 = num1 != num2; // 不等于运算,result4的值为1(真)```3. 逻辑运算符:```cint num1 = 10, num2 = 5;int result1 = (num1 > num2) && (num1 != num2); // 与运算,result1的值为1(真)int result2 = (num1 < num2) || (num1 != num2); // 或运算,result2的值为1(真)int result3 = !(num1 < num2); // 非运算,result3的值为1(真)```三、控制语句控制语句用于实现程序的流程控制,包括条件语句(if-else语句)和循环语句(for循环、while循环和do-while循环)。

数值分析代码

数值分析代码

拉格朗日插值#include<iostream>#include<cmath>using namespace std;int lagrange(double *px,double *py,double *pcoeff,int iNum) { double *pk,*ptemp_coeff;int i,j,k,kk;pk=new double [iNum];ptemp_coeff=new double [iNum];for(i=0;i<iNum;i++) {pcoeff[i]=0.0;ptemp_coeff[i]=0.0;}for(i=0;i<iNum;i++) {pk[i]=1.0;for(j=0;j<iNum;j++) {if(i!=j) {pk[i]*=px[i]-px[j]; }}}for(i=0;i<iNum;i++) {ptemp_coeff[0]=1.0;for(j=0,k=0;j<iNum;j++) {if(j!=i) {for(k++,kk=k;kk>0;kk--) {ptemp_coeff[kk]-=ptemp_coeff[kk-1]*px[j];}}}for(j=0;j<iNum;j++)pcoeff[j]+=py[i]*ptemp_coeff[j]/pk[i];ptemp_coeff[j]=0.0;}}delete pk,ptemp_coeff;return 0;}double lagcaculate(double *pcoeff,double dxx,int iNum) { double dsum;int i;dsum=0.0;for(i=0;i<iNum;i++) {dsum=dsum*dxx+pcoeff[i];}return dsum;}int main() {int iNum,i,iisrandom;double *px,*py,*pcoeff;cout<<"本程序求解拉格朗日插值求解函数近似值" <<endl<<"请输入已知点个数:"<<endl;cin>>iNum;cout<<"是否进行自动测试(测试函数为正弦函数),是输入1,否输入0:";cin>>iisrandom;px=new double [iNum];py=new double [iNum];pcoeff=new double [iNum];if(iisrandom==0) {cout<<"请输入iNum个已知点的横坐标:"<<endl;for(i=0;i<iNum;i++) {cin>>px[i];}cout<<"请输入iNum个已知点的纵坐标:"<<endl;for(i=0;i<iNum;i++)cin>>py[i];}else {for(i=0;i<iNum;i++) {px[i]=i;py[i]=sin(i);}}lagrange(px,py,pcoeff, iNum);int testnum;cout<<"输入测试值数量";cin>>testnum;double *pxvalue;pxvalue=new double [testnum];double *pyvalue;pyvalue=new double [testnum];cout<<"输入"<<testnum<<"个需要测试的值"<<endl;for(i=0;i<testnum;i++) {cin>>pxvalue[i];}for(i=0;i<testnum;i++) {pyvalue[i]=lagcaculate(pcoeff,pxvalue[i],iNum);py[i]=sin(pxvalue[i]);}cout<<"拉格朗日公式求得的值"<<" "<<"标准函数值为"<<endl;for(i=0;i<testnum;i++) {cout<<pyvalue[i]<<" "<<py[i]<<endl; }delete px,py,pcoeff,pxvalue,pyvalue;return 0;}牛顿插值#include <iostream.h>#include <math.h>void main() {int n,i,j;double A[50][50];double x[50],y[50];double K=1,X=0,N=0,P;cout<<"请输入所求均差阶数:";cin>>n;for(i=0;i<=n;i++) {cout<<"请输入x"<<i<<"=";cin>>x[i];cout<<"请输入y"<<i<<"=";cin>>y[i];A[i][0]=x[i]; A[i][1]=y[i];}for(j=2;j<=n+1;j++) {for(i=1;i<=n;i++) {A[i][j]=(A[i][j-1]-A[i-1][j-1])/(A[i][0]-A[i-j+1][0]);}}for(i=0;i<=n;i++) {cout<<"输出第"<<i<<"阶均差为:"<<A[i][i+1]<<endl;}cout<<"请所要代入计算的x的值:X=";cin>>X;for(i=0;i<n;i++) {K*=X-x[i];N+=A[i+1][i+2]*K;P=A[0][1]+N;}c o u t<<"所要求的函数值为:y="<<P<<endl;}复化梯形公式double f(double x){if(x==0) return 1;else return (sin(x)/x);}double FuhuaTixing(int n,double a,double b){double h = (b-a)/n;double x = a;double s = 0;for(int k=0; k< n-1; k++){x += h;s += f(x);}double T = (f(a)+s*2+f(b))*h/2;return T;}int main(){char ans='n';do{cout<<"请输入积分区间(a,b):"<<endl;double a;double b;cin>>a>>b;cout<<"请输入等分份数n: "<<endl;int n; cin>>n;cout<<"由复化梯形公式球的结果:"<<FuhuaTixing(n,a,b)<<endl; cout<<"是否要继续?(y/n)";cin>>ans;}while(ans == 'y');return 0;}改进欧拉#include"stdio.h"#include"iostream"using namespace std;double x,x1,y,y1;int main(){double h;int n;cout<<endl<<"input x0=";cin>>x0;cout<<endl<<"input y0=";cin>>y0;cout<<endl<<"intput h=";cin>>h;cout<<endl<<"intput n=";cin>>n;mend_euler euler(h,n);getch();return 1;}class mend_euler{public:mend_euler(double h,int n);double f(double x,double y);private:double h;int n;};mend_euler::mend_euler(double a,int b){int i=1; h=a; n=b;while(i<=n) {x1=x0+h;y1=y0+h/2*(f(x0,y0)+f(x1,y0+h*f(x0,y0)));cout<<endl;cout<<"x1="<<x1<<" y1="<<y1<<" y="<<x0/(1+x0*x0)<<" e="<<y1-x0/(1+x0*x0) <<endl;i++;x0=x1;y0=y1;}}double mend_euler::f(double x,double y){ return 4*x*y/(1+x*x)+1; }四阶龙格库塔#include <iostream.h> #include <math.h>double f1(double t, double x, double y, double z) { return -x + 6 * y + 2 * z; }double f2(double t, double x, double y, double z) { return -y + 3 * z + 2 * sin(t); }double f3(double t, double x, double y, double z) { return -z + pow(t,2) * exp(-t) + cos(t); } double RungeKutta(double x0, double y0, double z0, double a, double b, int n, double x[], double y[], double z[], double (*f1)(double,double,double,double), double (*f2)(double,double,double,do uble), double (*f3)(double,double,double,double)){double k1, k2, k3, k4double m1, m2, m3, m4double n1, n2, n3, n4double h; double t;int count; count =0;h = (b - a) / n;x[0] = x0;y[0] = y0;z[0] = z0;for(int i = 1;i<=n;i++) {t = a + (i - 1) * h;k1 = f1(t, x[i - 1], y[i - 1], z[i - 1]);m1 = f2(t, x[i - 1], y[i - 1], z[i - 1]);n1 = f3(t, x[i - 1], y[i - 1], z[i - 1]);k2 = f1(t+h/2.0, x[i - 1] + k1 * h / 2.0, y[i - 1] + m1 * h / 2.0, z[i - 1] + n1 * h / 2.0);m2 = f2(t+h/2.0, x[i - 1] + k1 * h / 2.0, y[i - 1] + m1 * h / 2.0, z[i - 1] + n1 * h / 2.0);n2 = f3(t+h/2.0, x[i - 1] + k1 * h / 2.0, y[i - 1] + m1 * h / 2.0, z[i - 1] + n1 * h / 2.0); k3 = f1(t+h/2.0, x[i - 1] + k2 * h / 2.0, y[i - 1] + m2 * h / 2.0, z[i - 1] + n2 * h / 2.0);m3 = f2(t+h/2.0, x[i - 1] + k2 * h / 2.0, y[i - 1] + m2 * h / 2.0, z[i - 1] + n2 * h / 2.0);n3 = f3(t+h/2.0, x[i - 1] + k2 * h / 2.0, y[i - 1] + m2 * h / 2.0, z[i - 1] + n2 * h / 2.0);k4 = f1(t+h/2.0, x[i - 1] + k3 * h / 2.0, y[i - 1] + m3 * h / 2.0, z[i - 1] + n3 * h / 2.0);m4 = f2(t+h/2.0, x[i - 1] + k3 * h / 2.0, y[i - 1] + m3 * h / 2.0, z[i - 1] + n3 * h / 2.0);n4 = f3(t+h/2.0, x[i - 1] + k3 * h / 2.0, y[i - 1] + m3 * h / 2.0, z[i - 1] + n3 * h / 2.0);x[i] = x[i - 1] + h * (k1 + 2 * k2 + 2 * k3 + k4) / 6.0;y[i] = y[i - 1] + h * (m1 + 2 * m2 + 2 * m3 + m4) / 6.0;z[i] = z[i - 1] + h * (n1 + 2 * n2 + 2 * n3 + n4) / 6.0; ++count;cout<<"t= "<<t+0.05<<" "<<"x= "<<x[i]<<" "<<"y= "<<y[i]<<" "<<"z= "<<z[i]<<endl;}cout<<"共计算的次数为:"<<count<<endl; return 0;}void main() { double x[110]; double y[110];double z[110];RungeKutta(1.0,-1.0,0.0,0.0,5.0,100,x,y,z,f1,f2,f3); }弦截法#include<iostream>#include<math.h>using namespace std;class imaroot{public:virtual float f(float x)=0;virtual float x(float x1,float x2)=0;};class root:public imaroot{public:float f(float x){float y;y=((x-5.0)*x+16.0)*x-80.0;return y;}float x(float x1,float x2){float x;x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));return x;}};int main(){root a;float x,c,d;cout<<"输入任意2点横坐标(x1<x2)"<<endl;cin>>c>>d;if(a.f(c)*a.f(d)>=0){do{cout<<"f(x1)与f(x2)同号重新输入"<<endl;cin>>c>>d;}while(a.f(c)*a.f(d)>=0);}if(a.f(c)*a.f(d)<0)x=a.x(c,d);if(a.f(x)*a.f(c)>0){do{x=a.x(x,d);}while(abs(a.f(x))>=0.0001);}else{do{x=a.x(c,x);}while(abs(a.f(x))>=0.0001);}cout<<"方程根是:"<<x<<endl;return 0;}用C语言实现高斯-赛德尔迭代方法,源程序代码:#include "stdlib.h"#include "stdio.h"#include "conio.h"#include "string.h"#include "math.h"#define N 100float Table(int n,float a[N][N],float b[N]){ int i,j; float c[N][N];printf("Please input the matrix A by row!\n"); label:for(i=0;i<n;i++) { printf("Row %d:",i+1); for(j=0;j<n;j++)scanf("%f",&a[i][j]); }printf("Please input the vector b:");for(i=0;i<n;i++)scanf("%f",&b[i]);for(i=0;i<n;i++)for(j=0;j<n;j++) {if(i==j) {c[i][j]=0;continue; }c[i][j]=-a[i][j]/a[i][i]; } printf("\nThe matrix A and vector b:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++)printf("%10.5f",a[i][j]);printf("%10.5f",b[i]);printf("\n");}printf("\nThe Gauss-Seidel iterative scheme:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%10.5f",c[i][j]);printf("%10.5f",b[i]/a[i][i]);printf("\n"); } }float init_vec(int n,float x[N]){I nt i;printf("Please input the initial iteration vector x:");for(i=0;i<n;i++)scanf("%f",&x[i]);printf("\nThe initial iteration vector x:\n"); for(i=0;i<n;i++) printf("%10.5f",x[i]);printf("\n");}float gs(int n,float a[N][N],float b[N],float x[N]) {int i,j,k;float tmp1,tmp2,x2[N];for(k=0;k<10001;k++){for(i=0;i<n;i++)x2[i]=x[i];for(i=0;i<n;i++){tmp1=0.0;tmp2=0.0;for(j=0;j<i;j++)tmp1+=a[i][j]*x[j];for(j=i+1;j<n;j++)tmp2+=a[i][j]*x2[j];x[i]=(b[i]-tmp1-tmp2)/a[i][i];}for(i=0,j=0;i<n;i++)if(fabs(x2[i]-x[i])<0.00001) j++;if(j==n){printf("\nThis Gauss-Seidel iterative scheme is convergent!");printf("\nNumber of iterations: %d",k+1);break; }if(k==499){printf("\nThis Jacobi iterative scheme may be not convergent!"); break; }}printf("\nThe results:\n");for(i=0;i<n;i++)printf("%12.7f",x[i]);}int main() {int n;float x[N],a[N][N],b[N];printf("Input n:");scanf("%d",&n);Table(n,a,b);init_vec(n,x);gs(n,a,b,x);getch();}高斯消去#include "Stdio.h"#include "Conio.h"/*L是矩阵的行减1,从程序上看是最外层循环的次数N 对应矩阵的行数,M对应矩阵的列数可以通过改变L、N、M来控制矩的阶数*/#define L 3#define N 4#define M 5void gauss(double a[N][M],double x[N]){int i,j,l,n,m,k=0;double temp[N];/*第一个do-while是将增广矩阵消成上三角形式*/do{n=0;for(l=k;l<L;l++)temp[n++]=a[l+1][k]/a[k][k];for(m=0,i=k;i<N;i++,m++)for(j=k;j<M;j++)a[i+1][j]-=temp[m]*a[k][j];k++;}while(k<N) ;/*第二个do-while是将矩阵消成对角形式,并且重新给k赋值*/k=L-1;do{n=0;for(l=k;l>=0;l--)temp[n++]=a[k-l][k+1]/a[k+1][k+1];for(m=0,i=k;i>=0;i--,m++)for(j=k;j<M;j++)a[k-i][j]-=temp[m]*a[k+1][j];k--;}while(k>=0) ;/*下一个for是解方程组*/for(i=0;i<N;i++)x[i]=a[i][N]/a[i][i];}void menu(){printf("\n _ _ _ _ _\n");printf(" 1.operation\n");printf(" 2.exit");printf("\n _ _ _ _ _\n");}main(){int i,j,choose;double a[N][M]={0},answer[N];clrscr();while(1){leep:menu();scanf("%d",&choose);switch(choose){case 1:printf("!!The size of Maxrix is %d * %d,each line enter %d element:\n ",N,M,M); for(i=0;i<N;i++){printf("Enter the Matrix's %d line:\n",i);for(j=0;j<N+1;j++)scanf("%lf",&a[i][j]);}printf("\nthe corss matrix is:\n_ _ _ _ _\n");gauss(a,answer);for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%-2lf ",a[i][j]);putchar('\n');}printf("_ _ _ _ _\nthe solve is:\n");for(i=0;i<N;i++)printf("x%d=%lf\n",i+1,answer[i]); break;case 2:exit(0);break;default:printf("input error:\n");goto leep;}}getch();}。

数值分析方法计算定积分

数值分析方法计算定积分

数值分析⽅法计算定积分⽤C语⾔实现⼏种常⽤的数值分析⽅法计算定积分,代码如下:1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 #include <math.h>56#define EPS 1.0E-14 //计算精度7#define DIV 1000 //分割区间,值越⼤,精确值越⾼8#define ITERATE 20 //⼆分区间迭代次数,区间分割为2^n,初始化应该⼩⼀点,否则会溢出910#define RECTANGLE 0 //矩形近似11#define TRAPEZOID 1 //梯形近似12#define TRAPEZOID_FORMULA 2 //递推梯形公式13#define SIMPSON_FORMULA 3 //⾟普森公式14#define BOOL_FORMULA 4 //布尔公式1516double function1(double);17double function2(double);18double function3(double);19void Integral(int, double f(double), double, double); //矩形, 梯形逼近求定积分公式20void Trapezoid_Formula(double f(double), double a, double b); //递推梯形公式21void Simpson_Formula(double f(double), double a, double b); //⾟普森公式22void Bool_Formula(double f(double), double a, double b); //布尔公式23void Formula(int, double f(double), double, double);2425double function1(double x)26 {27double y;28 y = cos(x);29return y;30 }3132double function2(double x)33 {34double y;35 y=1/x;36// y = 2+sin(2 * sqrt(x));37return y;38 }3940double function3(double x)41 {42double y;43 y = exp(x);44return y;45 }4647int main()48 {49 printf("y=cos(x) , x=[0, 1]\n");50 printf("Rectangle : "); Integral(RECTANGLE, function1, 0, 1);51 printf("Trapezoid : "); Integral(TRAPEZOID, function1, 0, 1);52 Formula(TRAPEZOID_FORMULA, function1, 0, 1);53 Formula(SIMPSON_FORMULA, function1, 0, 1);54 Formula(BOOL_FORMULA, function1, 0, 1);55 printf("\n");5657 printf("y=1/x , x=[1, 5]\n");58 printf("Rectangle : "); Integral(RECTANGLE, function2, 1, 5);59 printf("Trapezoid : "); Integral(TRAPEZOID, function2, 1, 5);60 Formula(TRAPEZOID_FORMULA, function2, 1, 5);61 Formula(SIMPSON_FORMULA, function2, 1, 5);62 Formula(BOOL_FORMULA, function2, 1, 5);63 printf("\n");6465 printf("y=exp(x) , x=[0, 1]\n");66 printf("Rectangle : "); Integral(RECTANGLE, function3, 0, 1);67 printf("Trapezoid : "); Integral(TRAPEZOID, function3, 0, 1);68 Formula(TRAPEZOID_FORMULA, function3, 0, 1);69 Formula(SIMPSON_FORMULA, function3, 0, 1);70 Formula(BOOL_FORMULA, function3, 0, 1);7172return0;73 }74//积分:分割-近似-求和-取极限75//利⽤黎曼和求解定积分76void Integral(int method, double f(double),double a,double b) //f(double),f(x), double a,float b,区间两点77 {79double x;80double sum = 0; //矩形总⾯积81double h; //矩形宽度82double t = 0; //单个矩形⾯积8384 h = (b-a) / DIV;8586for(i=1; i <= DIV; i++)87 {88 x = a + h * i;89switch(method)90 {91case RECTANGLE :92 t = f(x) * h;93break;94case TRAPEZOID :95 t = (f(x) + f(x - h)) * h / 2;96break;97default:98break;99 }100 sum = sum + t; //各个矩形⾯积相加101 }102103 printf("the value of function is %.10f\n", sum);104 }105106//递推梯形公式107void Trapezoid_Formula(double f(double), double a, double b)//递推梯形公式108 {109 unsigned int i, j, M, J=1;110double h;111double F_2k_1 = 0;112double T[32];113double res = 0;114115 T[0] = (f(a) + f(b)) * (b-a)/2;116for(i=0; i<ITERATE; i++)117 {118 F_2k_1 = 0;119 J = 1;120121for(j=0; j<=i; j++) //区间划分122 J <<= 1; //2^J123 h = (b - a) /J; //步长124//M = J/2; //2M表⽰将积分区域划分的块数125for(j=1; j <= J; j += 2) //126 {127 F_2k_1 += f(a + j*h); //f(2k-1)累加和128 }129 T[i+1] = T[i]/2 + h * F_2k_1; //递推公式130 res = T[i+1];131132if(fabs(T[i+1] - T[i]) < EPS)133if(i < 3) continue;134else break;135 }136137 printf("Trapezoid_Formula : the value of function is %.10f\n", res);138//return res;139 }140//⾟普森公式141void Simpson_Formula(double f(double), double a, double b) //⾟普森公式142 {143 unsigned int i, j, M, J=1;144double h;145double F_2k_1 = 0;146double T[32], S[32];147double res_T = 0, res_S = 0;148149 T[0] = (f(a) + f(b)) * (b-a)/2;150for(i=0; i<ITERATE; i++)151 {152 F_2k_1 = 0;153 J = 1;154155for(j=0; j<=i; j++) //区间划分156 J <<= 1; //2^J157 h = (b - a) /J; //步长158//M = J/2; //2M表⽰将积分区域划分的块数159for(j=1; j <= J; j += 2) //160 {161 F_2k_1 += f(a + j*h); //f(2k-1)累加和163 T[i+1] = T[i]/2 + h * F_2k_1; //递推梯形公式164 res_T = T[i+1];165166if(fabs(T[i+1] - T[i]) < EPS)167if(i < 3) continue;168else break;169 }170171for(i=1; i<ITERATE; i++)172 {173 S[i] = (4 * T[i] - T[i-1]) / 3; //递推⾟普森公式174 res_S = S[i];175if(fabs(S[i] - S[i-1]) < EPS)176if(i < 3) continue;177else break;178 }179180 printf("Simpson_Formula : the value of function is %.10f\n", res_S);181//return res_S;182 }183184//布尔公式185void Bool_Formula(double f(double), double a, double b) //布尔公式186 {187 unsigned int i, j, M, J=1;188double h;189double F_2k_1 = 0;190double T[32], S[32], B[32];191double res_T = 0, res_S = 0, res_B;192193 T[0] = (f(a) + f(b)) * (b-a)/2;194for(i=0; i<ITERATE; i++)195 {196 F_2k_1 = 0;197 J = 1;198199for(j=0; j<=i; j++) //区间划分200 J <<= 1; //2^J201 h = (b - a) /J; //步长202//M = J/2; //2M表⽰将积分区域划分的块数203for(j=1; j <= J; j += 2) //204 {205 F_2k_1 += f(a + j*h); //f(2k-1)累加和206 }207 T[i+1] = T[i]/2 + h * F_2k_1; //递推公式208 res_T = T[i+1];209210if(fabs(T[i+1] - T[i]) < EPS)211if(i < 3) continue;212else break;213 }214215for(i=1; i<ITERATE; i++)216 {217 S[i] = (4 * T[i] - T[i-1]) / 3; //递推⾟普森公式218 res_S = S[i];219if(fabs(S[i] - S[i-1]) < EPS)220if(i < 3) continue;221else break;222 }223224for(i=1; i<ITERATE; i++)225 {226 B[i] = (16 * S[i] - S[i-1]) / 15; //递推布尔公式227 res_B = B[i];228if(fabs(B[i] - B[i-1]) < EPS)229if(i < 3) continue;230else break;231 }232233 printf("Bool_Formula : the value of function is %.10f\n", res_B);234//return res_B;235 }236237//采⽤⼆分区间的⽅法迭代,实际运⾏速度很慢238void Formula(int method, double f(double), double a, double b)//递推梯形公式239 {240 unsigned int i, j, M, J=1;241double h;242double F_2k_1 = 0;243double T[32], S[32], B[32];244double res_B = 0, res_S = 0, res_T = 0;247for(i=0; i<ITERATE; i++)248 {249 F_2k_1 = 0;250 J = 1;251252for(j=0; j<=i; j++) //区间划分253 J <<= 1; //2^J254 h = (b - a) /J; //步长255//M = J/2; //2M表⽰将积分区域划分的块数256for(j=1; j <= J; j += 2) //257 {258 F_2k_1 += f(a + j*h); //f(2k-1)累加和259 }260 T[i+1] = T[i]/2 + h * F_2k_1; //递推公式261 res_T = T[i+1];262263if(fabs(T[i+1] - T[i]) < EPS)264if(i < 3) continue;265else break;266 }267268switch(method)269 {270default :271case TRAPEZOID_FORMULA :272 printf("Trapezoid_Formula : the value of function is %.10f\n", res_T); 273//return res_T;274break;275case SIMPSON_FORMULA :276for(i=1; i<ITERATE; i++)277 {278 S[i] = (4 * T[i] - T[i-1]) / 3;279 res_S = S[i];280if(fabs(S[i] - S[i-1]) < EPS)281if(i < 3) continue;282else break;283 }284 printf("Simpson_Formula : the value of function is %.10f\n", res_S); 285//return res_S;286break;287case BOOL_FORMULA :288for(i=1; i<ITERATE; i++)289 {290 S[i] = (4 * T[i] - T[i-1]) / 3;291 res_S = S[i];292if(fabs(S[i] - S[i-1]) < EPS)293if(i < 3) continue;294else break;295 }296for(i=1; i<ITERATE; i++)297 {298 B[i] = (16 * S[i] - S[i-1]) / 15;299 res_B = B[i];300if(fabs(B[i] - B[i-1]) < EPS)301if(i < 3) continue;302else break;303 }304305 printf("Bool_Formula : the value of function is %.10f\n", res_B); 306//return res_B;307break;308 }309310 }测试结果:。

数值分析-方程迭代法

数值分析-方程迭代法

实验内容1 用下列方法求方程201303==--x x x 在附近的根,要求准确到四位有效数字。

(1)牛顿法。

(2)单点弦截法(3)双点弦截法2 用Aitken 法求方程0123=--x x 在5.10=x 附近的根,精度要求为410-=ε。

三 实验步骤(算法)与结果1: 用双点弦截法求方程201303==--x x x在附近的根①算法的C 语言代码:#include<stdio.h>#include<math.h>double f(double x){ double f;f=x*x-1/x;return f;}void main(){double y=0,z=0,x;printf("please enter a number near the root: ") ;scanf("%f",&x);for (y=f(x),z=f(y);fabs(z-y)>5e-5;){x=(x*z-y*y)/(x-2*y+z) ;y=f(x);z=f(y);}printf("the root is:") ;printf("X=%-10.4f\n",z);}②实验结果:如下图,按题要求输入2,则可得结果X=1.46562:用Aitken 法求方程0123=--x x在5.10=x 附近的根①算法的C 语言代码:#include<stdio.h>#include<math.h>double f(double x){double f=pow(x,3)-3*x-1;return f;}void main(){double f1,f2,x=2.0,y=1.5,z;for(;fabs(y-x)>5e-5;){f1=f(x);f2=f(y);z=y-f2*(y-x)/(f2-f1);x=y;y=z;}printf("the root is:") ;printf("X=%-10.4f\n",y);}②实验结果:如下图,在程序代码中预先设置接近于根的两个值x1=2.0与x2=1.5作为初值,则可得结果X=1.8794.。

汉诺塔c语言程序代码

汉诺塔c语言程序代码

汉诺塔c语言程序代码(通过vc++6.0验证)(附讲解)让我们先看看代码吧#include <stdio.h>int hj(int a,int b, int c,int i){int t;if(i==1)printf("%d->%d\n",a,c);else{t=c;c=b;b=t;hj(a,b,c,i-1);printf("%d->%d\n",a,b);t=a;a=c;c=t;t=b;b=c;c=t;hj(a,b,c,i-1);return 0;}}main(){int a,b,c,i;a=1;b=2;c=3;printf("请输入汉诺塔的盘数");scanf("%d",&i);hj(a,b,c,i);return 0;}以上是汉诺塔的代码,该程序主要是运用了递归的思想,比如数学中的f(x)=f(x-1)+f(x-2),在本程序中为:int hj(int a,int b, int c,int i){int t;if(i==1)printf("%d->%d\n",a,c);else{t=c;c=b;b=t;hj(a,b,c,i-1);也就是说,我们在这个函数中再次调用这个函数,相当于一个循环,而在再次调用的过程中,i的值变成i-1,就类似于f(x-1),这样层层调用,最终就变成当i=1的时候的值,然后通过运算,计算出想要得到的值。

汉诺塔的数值分析:我们可以发现,当只有一个盘的时候,我们只需要做1->3(就是把第一个柱子上的最顶端的盘移动到第三根柱子,以下不再解释)当有两个盘的时候,是1->2 1->3 2->3三个盘子是:1->3 1->2 3->2 1->3 2->1 2->3 1->3分析一下可以得出以下结论:初始值a=1 b=2 c=3一个盘子就是a->c两个盘子与一个盘子的关系是:第一步:b与c交换值,然后打印a->c第二步:打印a->b第三步:a与c交换值,b与c交换值,打印a->c进一步分析,便可以得出以下结论只要盘子数量为i(i大于1),那么它就有三部分第一部分,b与c交换值,然后运行i-1第二部分,打印a->b第三部分,a与c交换值,b与c交换值,然后运行i-1程序表示便是:if(i==1)printf("%d->%d\n",a,c);else{t=c;c=b;(交换值)b=t;hj(a,b,c,i-1);printf("%d->%d\n",a,b);t=a;a=c;c=t;(a c交换)t=b;b=c;c=t;(b c交换)hj(a,b,c,i-1);不明加QQ765233918(请写清备注)如有侵权请联系告知删除,感谢你们的配合!。

数值分析算法C语言程序

数值分析算法C语言程序

数值分析算法C语言程序数值分析是研究数学问题的近似解法的一门学科,其中包括了各种数值方法和算法。

本文将介绍数值分析中的常见算法,并给出相应的C语言程序。

1.二分法(Bisection Method)二分法是一种求函数零点的简单且常用的方法。

该方法的基本思想是通过不断将区间进行二分,并比较中点处函数值的正负来找到零点所在的区间。

```c#include <stdio.h>double f(double x)return x * x - 2;double bisection(double a, double b, double eps)double c;while ((b - a) > eps)c=(a+b)/2;if (f(c) == 0)break;}else if (f(a) * f(c) < 0)b=c;}elsea=c;}}return c;int maidouble a = 0.0;double b = 2.0;double result = bisection(a, b, eps);printf("The root is: %lf\n", result);return 0;```2.牛顿迭代法(Newton's Method)牛顿迭代法是一种高效的求函数零点的方法。

该方法的基本思想是通过对函数进行线性逼近,不断逼近函数的零点。

```c#include <stdio.h>#include <math.h>double f(double x)return x * x - 2;double df(double x)return 2 * x;double newton(double x0, double eps) double x = x0;double deltaX = f(x) / df(x);while (fabs(deltaX) > eps)deltaX = f(x) / df(x);x = x - deltaX;}return x;int maidouble x0 = 2.0;double result = newton(x0, eps); printf("The root is: %lf\n", result); return 0;```3.高斯消元法(Gaussian Elimination)高斯消元法是一种用于求解线性方程组的方法。

C语言常用的小代码

C语言常用的小代码

四舍五入
有时我们需要通过四舍五入避免浮点数误差。如பைடு நூலகம்00经过开方运算本应得到10,但sqrt函数却“一不小心”的到了99.999,为了避免影响到 我们的程序,需要进行四舍五入。这里用到了floor()函数,它的作用是返回一个数的整数部分,即向下取整。四舍五入的代码如下:
y = floor( x + 0.5 ); //将x进行四舍五入得到y
网络错误421请刷新页面重试持续报错请尝试更换浏览器或网络环境
圆 周 率 Pi
C语 言 常 用 的 小 代 码
tan(Pi/4)=1 => Pi=4*arctan(1) 反正切函数arctan()在C语言里表示为atan(),为保证精度取圆周率的代码如下:
const double Pi = 4.0 * atan(1.0);

《数值分析》上机实验报告

《数值分析》上机实验报告

数值分析上机实验报告《数值分析》上机实验报告1.用Newton 法求方程 X 7-X 4+14=0在(0.1,1.9)中的近似根(初始近似值取为区间端点,迭代6次或误差小于0.00001)。

1.1 理论依据:设函数在有限区间[a ,b]上二阶导数存在,且满足条件{}αϕ上的惟一解在区间平方收敛于方程所生的迭代序列迭代过程由则对任意初始近似值达到的一个中使是其中上不变号在区间],[0)(3,2,1,0,)(')()(],,[x |))(),((|,|,)(||)(|.4;0)(.3],[)(.20)()(.110......b a x f x k x f x f x x x Newton b a b f a f mir b a c x f ab c f x f b a x f b f x f k k k k k k ==-==∈≤-≠>+令)9.1()9.1(0)8(4233642)(0)16(71127)(0)9.1(,0)1.0(,1428)(3225333647>⋅''<-=-=''<-=-='<>+-=f f x x x x x f x x x x x f f f x x x f故以1.9为起点⎪⎩⎪⎨⎧='-=+9.1)()(01x x f x f x x k k k k 如此一次一次的迭代,逼近x 的真实根。

当前后两个的差<=ε时,就认为求出了近似的根。

本程序用Newton 法求代数方程(最高次数不大于10)在(a,b )区间的根。

1.2 C语言程序原代码:#include<stdio.h>#include<math.h>main(){double x2,f,f1;double x1=1.9; //取初值为1.9do{x2=x1;f=pow(x2,7)-28*pow(x2,4)+14;f1=7*pow(x2,6)-4*28*pow(x2,3);x1=x2-f/f1;}while(fabs(x1-x2)>=0.00001||x1<0.1); //限制循环次数printf("计算结果:x=%f\n",x1);}1.3 运行结果:1.4 MATLAB上机程序function y=Newton(f,df,x0,eps,M)d=0;for k=1:Mif feval(df,x0)==0d=2;breakelsex1=x0-feval(f,x0)/feval(df,x0);ende=abs(x1-x0);x0=x1;if e<=eps&&abs(feval(f,x1))<=epsd=1;breakendendif d==1y=x1;elseif d==0y='迭代M次失败';elsey= '奇异'endfunction y=df(x)y=7*x^6-28*4*x^3;Endfunction y=f(x)y=x^7-28*x^4+14;End>> x0=1.9;>> eps=0.00001;>> M=100;>> x=Newton('f','df',x0,eps,M);>> vpa(x,7)1.5 问题讨论:1.使用此方法求方解,用误差来控制循环迭代次数,可以在误差允许的范围内得到比较理想的计算结果。

c语言编程代码

c语言编程代码

c语言编程代码C语言是一种通用的高级编程语言,它具有广泛的应用领域,包括嵌入式系统、游戏开发、操作系统以及各种应用软件等。

本文将为您介绍一些常用的C语言编程代码示例,以帮助您更好地了解和学习C语言编程。

1. Hello World!#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}以上代码是C语言中最经典的例子——Hello World。

它用于验证编译器和运行环境是否正常工作。

该代码会在控制台输出"Hello, World!"。

2. 变量和数据类型#include <stdio.h>int main() {int num1 = 10;float num2 = 3.14;char letter = 'A';printf("num1: %d\n", num1);printf("num2: %.2f\n", num2);printf("letter: %c\n", letter);return 0;}以上代码演示了在C语言中声明和使用变量的方法。

我们定义了一个整型变量num1,一个浮点型变量num2,以及一个字符型变量letter,并通过printf函数输出它们的值。

3. 条件语句#include <stdio.h>int main() {int num = 5;if(num > 0) {printf("Positive number\n");}else if(num < 0) {printf("Negative number\n");}else {printf("Zero\n");}return 0;}以上代码展示了C语言中的条件语句。

数值分析实验报告

数值分析实验报告

《数值分析》实验报告学院:计算机科学与软件学院姓名:XXX班级:计算机XX班学号:XXXXXX实验一:舍入误差与数值稳定性实验目的:1、 通过上机编程,复习巩固以前所学程序设计语言;2、 通过上机计算,了解舍入误差所引起的数值不稳定性。

3、 通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象。

实验内容:用两种不同的顺序计算644834.11000012≈∑=-n n ,分析其误差的变化。

实验流程图:实验源程序:#include <stdio.h>#include <math.h>void main(){ int i;float s1=0,s2=0,d1,d2;for (i=1;i<=10000;i++)s1=s1+1.0f/(i*i);for (i=10000;i>=1;i--)s2=s2+1.0f/(i*i);d1=(float)(fabs(1.644834-s1));d2=(float)(fabs(1.644834-s2));printf("正向求和结果为%f\n 误差为%f\n\n",s1,d1);printf("反向求和结果为%f\n 误差为%f\n\n",s2,d2);if(d1<d2)printf("正向求和误差小于负向求和误差\n");else if(d1==d2)printf("正向求和误差等于负向求和误差\n"); elseprintf("正向求和误差大于负向求和误差\n");}实验结果:实验分析:第一次做数值实验,又一次使用C语言编程,没有了刚学习C语言的艰难,能够将实验步骤转换成流程图并编写出完整的实验代码,在经过多次调试、改正后得到正确的程序和结果。

这个实验较简单,计算误差时如果输入数据有误差,而在计算过程中舍入误差不增长,则称此算法是稳定的,否则称此算法是数值不稳定的,减少运算次数可以减小舍入误差。

c语言源代码

c语言源代码

c语言源代码在计算机科学领域,C语言是一种被广泛应用的程序设计语言,它以其简洁、高效和可移植性而闻名。

本文将提供一些C语言的源代码示例,帮助读者更好地理解和应用这门编程语言。

1. Hello World程序#include <stdio.h>int main() {printf("Hello, World!");return 0;}上述代码是C语言中经典的Hello World程序。

它使用了stdio.h头文件,其中包含了用于输入输出的函数。

main()函数是程序的入口点,它执行printf函数并打印出"Hello, World!"的字符串。

最后,return语句表示程序正常结束。

2. 计算两个数的和#include <stdio.h>int main() {int num1, num2, sum;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);sum = num1 + num2;printf("两个数的和为:%d", sum);return 0;}以上代码展示了如何用C语言编写一个简单的计算两个数的和的程序。

通过使用scanf函数,用户可以在程序运行时输入两个整数。

程序将这两个数相加,并使用printf函数打印出结果。

3. 判断一个数是否为质数#include <stdio.h>int main() {int num, i, isPrime = 1;printf("请输入一个正整数:");scanf("%d", &num);for (i = 2; i <= num / 2; ++i) {if (num % i == 0) {isPrime = 0;break;}}if (isPrime)printf("%d是质数", num);elseprintf("%d不是质数", num);return 0;}上述代码展示了如何用C语言编写一个判断一个数是否为质数的程序。

数值分析 实验三Newton插值多项式

数值分析 实验三Newton插值多项式

数学与软件科学学院实验报告学期:至第学期年月日课程名称:___计算机数值方法_ 专业:信心与计算科学 08 级 6班实验编号:3 实验项目Newton插值多项式指导教师__张莉_姓名:田文晓学号:2008060632 实验成绩:一、实验目的及要求实验目的:掌握Newton插值多项式的算法,理解Newton插值多项式构造过程中基函数的继承特点,掌握差商表的计算特点。

实验要求:1. 给出Newton插值算法2. 用C语言实现算法二、实验内容1. 用下列插值节点数据,构造Newton插值多项式,并计算2. 用下列插值节点数据,构造一个三次Newton插值多项式,并计算f(1.2)的值。

三、实验步骤(该部分不够填写.请填写附页)步骤1:算法描述:输入n值,及(x_i,y_i),i=0,1,2,…n;记f(x_i)=y_i;For i=0,1,2…n计算差商f[x0,x1,x2,…x_k]=(f[x1,x2,…x_k]-f[x0,x1,x_k-1])/(x_k-x0) 其中 f[x_i]=f(x_i);对给定的x ,由N_n(x)=f(x0)+(x-x0)f[x0,x1]+(x-x0)(x-x1)f[x0,x1.x2]+...(x-x0)(x-x 1)(x-x2)...(x-x_n-1)f[x0,x1,...x_n]计算出N_n(x)的值输出N_n(x)的值步骤2:程序代码如下:#include<stdio.h>#define MAX_N 30typedef struct tagPOINT /*the structer of point */{double x;double y;}POINT;int main(){int n,i,j;POINT points[MAX_N+1];double tmp,newton=0;double diff[MAX_N+1];double x;clrscr();printf("\nInput n value :"); /*the number of the points inserted*/scanf("%d",&n);if(n>MAX_N){printf("The input n is larger than MAX_N,please redefine the MAX_N.\n");return 1;}if(n<=0){printf("Please input a number between 1 and %d.\n",MAX_N);return 1;}printf("Now input the (x_i,y_i),i=0,...%d:\n",n);for(i=0;i<=n;i++)scanf("%lf %lf",&points[i].x,&points[i].y);printf("Now input the x value:"); /*the value of x*/scanf("%lf",&x);for(i=0;i<=n;i++) diff[i]=points[i].y;for(i=0;i<n;i++){for(j=n;j>i;j--){diff[j]=(diff[j]-diff[j-1])/(points[j].x-points[j-1-i].x); }}tmp=1;newton=diff[0];for(i=0;i<n;i++){tmp=tmp*(x-points[i].x);newton=newton+tmp*diff[i+1];}printf("newton(%f)=%f\n",x,newton);return 0;}四,实验结果与分析:当输入x=0.9时,利用牛顿二次插值得到结果如下:Input n value :2Now input the (x_i,y_i),i=0,...2:0 11 22 19Now input the x value:0.9newton(0.900000)=1.180000当输入x=0.9时,利用牛顿三次插值得到结果如下:Input n value :3Now input the (x_i,y_i),i=0,...3:-2 170 12 191 2Now input the x value:0.9newton(0.900000)=1.303750输入当x=1.2时,得到结果如下:Input n value :3Now input the (x_i,y_i),i=0,...3:-1.00 3.002.00 5.003.00 7.004.005.00Now input the x value:1.2newton(1.200000)=2.401600注:实验成绩等级分为(90-100分)优,(80-89分)良,(70-79分)中,(60-69分)及格,(59分)不及格。

数值分析之幂法及反幂法C语言程序实例

数值分析之幂法及反幂法C语言程序实例
}
u[N-1]=y[N-1]/A[S][N-1];
for(i=N-1;i>0;i--)
{
temp=0;
for(t=i+1;t<=min(i+S,N);t++)
temp+=A[i-t+S][t-1]*u[t-1];
u[i-1]=(y[i-1]-temp)/A[S][i-1];
}
}
double Det_matrix()//求矩阵行列式值
if(fabs((value2-value1)/value1)<e)
break;
}
value_s=value1;
}
float Get_cond_A()//求矩阵条件数
{
float cond1;
cond1=fabs(value_abs_max/value_s);
return cond1;
}
void Value_translation_min()//偏移条件下反幂法求特征值
{
int i;
double det=1;
Init_matrix_A();
Resolve_LU();
for(i=0;i<N;i++)
det=det*A[2][i];
return det;
}
float Get_norm()//获得迭代向量模
{
int i;
float normal=0;
for(i=0;i<N;i++)
Init_u();
norm=Get_norm();
Get_yy(norm);
Back_substitution();

数值分析c++高斯赛德尔迭代

数值分析c++高斯赛德尔迭代

t+=a[i][j]*x0[j]; x[i]=(b[i]-t)/a[i][i]; pre[i]=fabs(x[i]-x0[i]); x0[i]=x[i]; } printf("execute time :%d for(i=0;i<3;i++) printf("%f printf("\n"); for(j=1;j<3;j++) if(max<pre[j]) max=pre[j]; k++; }while(max>e0&&k<n); if(k>n) printf("failure!please check your work or set and try again");} ",x[i]); ",k);[4]对应题目运行结果:[1]高斯赛德尔流程图:
开始
输入 x0[3],a[3][3],b[3],e0,n
K=1,20, 1
0->max
i,j=1,3,1
Bi-(
i −1 j=1 aijxj −
n j=i+1 aijxj)/aii->xi
xi->t
xi − t <=max
Y
xi − t ->max
i
高斯赛德尔迭代法高斯赛德尔高斯迭代c语言迭代牛顿迭代法c语言高斯牛顿迭代高斯牛顿迭代法牛顿迭代法c赛德尔迭代器
[2]高斯赛德尔迭代题目:
3* x1-2*x3=1 2*x2+ x3=0 -2*x1+x2+3*x3=2
[3]程序源代码:
#include"stdio.h" #include"math.h" float a[3][3],b[3],x0[3],x[3]; void input() {int i,j; printf("~~~~~~~~~~~~~~~~~~welcome to come in~~~~~~~~~~~~~~~~~~~\n "); printf("in the same line ,please input matrix a[3][3]:\n"); for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%f",&a[i][j]); printf("in the same line ,please input matrix b[3]\n"); for(i=0;i<3;i++) scanf("%f",&b[i]); printf("in the same line please input primitive value x0[3]\n"); for(i=0;i<3;i++) scanf("%f",&x0[i]); } main() {float e0=0.0001; int n=20,k=1,i,j; float pre[3]; float max=pre[0]; input(); printf("the result are as follows: \n\n"); do { for(i=0;i<3;i++) { float t=0; for(j=0;j<3;j++) if(j!=i)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息与软件工程学院
标准实验报告
(实验)课程名称计算数学基础电子科技大学教务处制表
电子科技大学
实验报告
学生姓名:何安迪学号:2013220701020指导教师:顾小丰
实验地点:实验中心306 实验时间:2015. 11.28
一、实验室名称:实验中心306
二、实验项目名称:计算数学(数值分析)的核心算法实现
三、实验原理
通过《计算数学基础》的课堂学习,参照《数值分析简明教程》的内容,熟练掌握插值方法、数值积分、方程求根的迭代法、线性方程组的迭代法、线性方程组的直接法等解题技巧。

使用算法对例题进行求解,并且通过在Visual Studio 中编写C程序实现解题的算法。

四、实验目的
基于课程的学习,使用Visual Studio编写C程序实现计算数学(数值分析)的核心算法,熟练掌握课堂上学习的各种算法,充分理解课本上的知识,并将之用于实例求解。

五、实验内容
1、最小二乘法:在[-1, 1]区间上取N = 21个等距结点,计算出以相应节点上
e x 的值做为数据样本,作出m = 3,5,7,9次的最小二乘多项式。

并计算出不同阶最小二乘多项式给出的最小偏差
六、实验环境
20
2
()(())
m i i
i
m y x y σ
=
=-

OS:Microsoft Windows 7 64bit
环境:Microsoft Visual Studio 2012
七、实验步骤
1. 实验一:最小二乘法,同样用到上面构造的高斯函数,根据最小二乘法的分划和多项式拟合公式构建实验二的函数void problem2(),代码如下。

void problem2() // 最小二乘法
{
double x[21] = { 0 }, y[21] = { 0 };
double a[4][4] = { 0 }, result_a[4] = { 0 };
double b[6][6] = { 0 }, result_b[6] = { 0 };
double c[8][8] = { 0 }, result_c[8] = { 0 };
double d[10][10] = { 0 }, result_d[10] = { 0 };
double right[10] = { 0 };
double *result[4] = { result_a, result_b, result_c, result_d };
for (int i = 0; i < 21; i++)
{
x[i] = -1 + i * 2 / 20.0;
y[i] = exp(x[i]);
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
for (int k = 0; k < 21; k++)
{
d[i][j] += pow(x[k], i + j);
}
if (i < 4 && j < 4)
{
a[i][j] = d[i][j]; b[i][j] = d[i][j]; c[i][j] = d[i][j];
}
elseif (i < 6 && j < 6)
{
b[i][j] = d[i][j]; c[i][j] = d[i][j];
}
elseif (i < 8 && j < 8)
{
c[i][j] = d[i][j];
}
}
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 21; j++)
{
right[i] += pow(x[j], i)*y[j];
}
}
Gauss(*a, right, result_a, 4);
Gauss(*b, right, result_b, 6);
Gauss(*c, right, result_c, 8);
Gauss(*d, right, result_d, 10);
for (int i = 0; i < 4; i++)
{
int k = i * 2 + 3;
printf("在[-1,1]内e^x的%d阶最小二乘多项式为:\n", k);
for (int j = 0; j < k; j++)
{
if (j == 0)
printf(" %10.8f*x^%d", result[i][j], j);
else
{
if (j % 4 == 0)
printf("\n");
printf("+%10.8f*x^%d", result[i][j], j);
}
}
printf("\n\n");
}
}
八、实验数据及结果分析
1. 主界面,供选择模拟哪个实验的算法。

图1 主界面
2. 录入2,选择实验一,计算得3、5、6、9阶的最小二乘多项式结果如下,根据验证结果正确。

图3 实验2结果
九、实验结论
在计算数学基础的这个小实验中,我重新系统地复习了数值分析中的最小二乘法。

成功地用C/C++模拟了上述算法,对本学期的课程所学的内容有了进一步的巩固和提升。

十、对本实验过程及方法、手段的改进建议
本次实验进展良好,但建议可以改用Matlab或者Octave模拟这些算法。

用matlab可以更为方便的展示,用C增加了些许的麻烦。

报告评分:
指导教师签字:。

相关文档
最新文档