数值分析 迭代法 C 程序

合集下载

数值方法C++代码大全上(包括二分法迭代法牛顿法等等)

数值方法C++代码大全上(包括二分法迭代法牛顿法等等)

数值方法C++代码大全上(包括二分法迭代法牛顿法等等)1.二分法#include#include#include //调用fabs函数。

double f(double x) //定义函数F(x)。

{return 2*x*x*x-x-1;}void main(){double a,b,w,x;cout<<"请输入方程根的区间[a,b]及误差w:";cin>>a>>b>>w;x=(a+b)/2;while(fabs(f(x))>w&&fabs(a-b)>w){ //用while循环控制中值折算的条件。

if(f(x)*f(b)<0) a=x; //进行二分,缩小求值范围。

else if(f(a)*f(x)<0) b=x;x=(a+b)/2;}cout<<x<<endl;< p="">}2.迭代法#include#include#include#includeusing namespace std;typedef double (*pFun)(double x);double getIterativeValue(double x){return pow((x+1)/2,(double)1.0/3);}double Solve(pFun f,double x,double e,int n){double res;while(n--){res = f(x);if(fabs(res - x) < e){outPrint("第%d次次迭代以后返回值为:%0.7lf \n",10-n,res); break;}elsex = res;outPrint("第%d次迭代以后x值为:%0.7lf\n ",10-n,x);}return res;}int main(){cout << setprecision(7);double x,e;cout << "输入初值和精度:" << endl;cin >> x >> e;cout << Solve(getIterativeValue,x,e,10) << endl;system("pause");return 0;3.牛顿法#include#include#include#includeusing namespace std;typedef double (*pFun)(double x);double getIterativeValue(double x){return pow((x+1)/2,(double)1.0/3);}double Solve(pFun f,double x,double e,int n){double res;while(n--){res = f(x);if(fabs(res - x) < e){printf("第%d次次迭代以后返回值为:%0.7lf \n",10-n,res); break;}elsex = res;printf("第%d次迭代以后x值为:%0.7lf\n ",10-n,x);}return res;}int main()cout << setprecision(7);double x,e;cout << "输入初值和精度:" << endl;cin >> x >> e;cout << Solve(getIterativeValue,x,e,10) << endl; return 0;}4.高斯消元法#include#include#define N 10 //矩阵大小范围/** 使用已经求出的x,向前计算x(供getx()调用)* float a[][] 系数矩阵* float x[] 方程组解* int i 解的序号* int n 矩阵大小* return 公式中需要的和*/float getm(float a[N][N], float x[N], int i, int n) {float m = 0;int r;for(r=i+1; r<="">{m += a[i][r] * x[r];}return m;}* 解方程组,计算x* float a[][] 系数矩阵* float b[] 右端项* float x[] 方程组解* int i 解的序号* int n 矩阵大小* return 方程组的第i个解*/float getx(float a[N][N], float b[N], float x[N], int i, int n){float result;if(i==n-1) //计算最后一个x的值result = float(b[n-1]/a[n-1][n-1]);else //计算其他x值(对于公式中的求和部分,需要调用getm()函数)result = float((b[i]-getm(a,x,i,n))/a[i][i]);return result;}void main()//float a[N][N] = {{2,1,1},{1,3,2},{1,2,2}}; //float b[N] = {4,6,5};float a[N][N]; //系数矩阵float b[N]; //右端项float x[N]; //方程组解int i,j,k;int n=N; //矩阵大小/*用户手工输入矩阵*/printf("请输入系数矩阵的大小:"); scanf("%d", &n);printf("请连续输入矩阵值:");for(i=0; i<="" p="">{for(j=0; j<="" p="">scanf("%f", &a[i][j]);}printf("请输入右端项:");for(i=0; i<="" p="">{scanf("%f", &b[i]);}/*显示原始矩阵*/printf("\n原始矩阵\n");for(i=0; i<="" p="">{for(j=0; j<="" p="">printf("%f ",a[i][j]);printf("\t|\t%f\n",b[i]);}printf("\n\n");/*进行高斯消去*/for(j=0; j<="" p="">{for(i=j+1; i<="" p="">{float m = (float)(a[i][j]/a[j][j]); for(k=j; k<="" p="">{a[i][k] = a[i][k]-m*a[j][k];}b[i] = b[i]-m*b[j];}}/*显示处理后矩阵*/printf("高斯消去后矩阵\n");for(i=0; i<="" p="">{for(j=0; j<="" p="">printf("%f ",a[i][j]);printf("\t|\t%f\n",b[i]);}/*回代方式解方程组*/for(i=n-1; i>=0; i--){x[i] = getx(a,b,x,i,n);}/*显示方程组解*/printf("\n\n方程组解\n");for(i=0; i<="" p="">{printf("x%d = %f\n", i+1,x[i]);}}5.高斯先列主元消元法采用高斯先列主元消元法求解线性方程组AX=b方法说明(以4阶为例):(1)第1步消元——在增广矩阵(A,b)第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A,b)做初等行变换使原方程组转化为如下形式:,注:“*”代表非0。

线性方程组的数值算法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 存在一个三角分解。

数值分析计算方法程序汇总

数值分析计算方法程序汇总

(一)复化梯形公式例:求121?x dx -=⎰程序:#include "stdio.h"void main(){double a,b,s,h,x;int i,n;a=-1.0;b=1.0;n=10;h=(b-a)/n;x=a;s=x*x/2;for(i=1;i<n;i++){x=x+h;s=s+x*x;}s=s+b*b/2;s=s*h;printf("s=%f\n",s);}结果:s=0.680000(二)复化辛普森公式例:求130?x dx=⎰程序:#include "stdio.h"void main(){double a,b,c,s,h,x,y;int i,n;a=0.0;b=1.0;n=10;s=0.0;h=(b-a)/n;x=a;y=x+h;c=(x+y)/2;for(i=1;i<=n;i++){s=s+x*x*x+4*c*c*c+y*y*y;x=x+h;y=y+h;c=c+h;}s=s*h/6;printf("s=%f\n",s);}结果:s=0.250000(三)复化高斯公式例:求220?x dx=⎰程序:#include <stdio.h>#include <math.h>main(){double a,b,h,s,x1,x2;int i,n;a=0;b=2;n=20;s=0;h=(b-a)/n;for(i=0;i<n;i++){x1=a+i*h+h/2*(1/1.732+1); x2=a+i*h+h/2*(1-1/1.732); s=s+x1*x1*x1+x2*x2*x2; }s=h/2*s;printf("s=%f\n",s);}结果:s=4.000000(四)迭代法例:求x=x2的解。

程序:#include "stdio.h"#include<math.h>main(){double x,xl,y,yl;int i,j;x=0.5;xl=x;y=0.5;yl=y;for(i=0;;i++){x=x*x;if(fabs(xl-x)<0.0001)break;else xl=x;}for(j=0;;j++){y=sqrt(y);if(fabs(yl-y)<0.0001)break;else yl=y;printf("x=%f,y=%f\n",x,y);}结果:x=0.000000,y=0.999915(五)牛顿迭代法y=f(x),求f(x*)=0。

数值分析 C语言 迭代法

数值分析 C语言 迭代法

数值分析实验报告上机实验题目用SOR 法求解方程组:分别取ω=0.65、1、1.2、1.45计算.要求精度为10-6;并指出迭代次数。

(参考P66解线性方程组的SOR 迭代算法)/*************************************************/ #include <stdio.h>#include <stdlib.h>#include <stdio.h>void SOR();double SORi(int);double SORj(int);doubleA[4][5]= {4,-6,2,-8,-8,-6,10,-6,14,12,2,-6,35,-15,16,-8,14,-15,22,13}; double X[4]={0};⎪⎪⎩⎪⎪⎨⎧=+-+-=-+-=+-+--=-+-1322151481615356212146106882644321432143214321x x x x x x x x x x x x x x x xint main(){printf("请输入w的值\n");scanf("%lf",&w);SOR();return 0;}void SOR(){int i=0,j,n=0,max;printf("输入迭代次数\n");scanf("%d",&max);while(n<max){printf("迭代第%d次\n",n);while(i<4){X[i]=X[i]+(w/A[i][i])*(A[i][4]-SORi(i)-SORj(i));printf("X[%d]=%lf8\n",i,X[i]);i++;}i=0;n++;}}double SORi(int i){int j=0;double sum=0;while(j<i){sum+=A[i][j]*X[j];j++;}return sum;}double SORj(int i){double sum=0;while(j<4){sum+=A[i][j]*X[j];j++;}return sum;}/*************************************************/ω=0.65时迭代了542次/*****************************************************************************/ ω=1时迭代了278次/********************************************************************/ =1.2时迭代了168次/*******************************************************************/ =1.45时迭代了137次由以上实验中得出 取值为1.45时迭代效率较高。

数值分析2 迭代法

数值分析2 迭代法

§2简单迭代法——不动点迭代(iterate)迭代法是数值计算中的一类典型方法,被用于数值计算的各方面中。

一、简单迭代法设方程f(x)=0 (3)在[a,b]区间内有一个根*x ,把(3)式写成一个等价的隐式方程x=g(x) (4)方程的根*x 代入(4)中,则有)(**=x g x (5)称*x 为g的不动点(在映射g下,象保持不变的点),方程求根的问题就转化为求(5)式的不动点的问题。

由于方程(4)是隐式的,无法直接得出它的根。

可采用一种逐步显式化的过程来逐次逼近,即从某个[a,b]内的猜测值0x 出发,将其代入(4)式右端,可求得)(01x g x =再以1x 为猜测值,进一步得到)(12x g x =重复上述过程,用递推关系——简单迭代公式求得序列}{k x 。

如果当k →∞时*→x x k ,}{k x 就是逼近不动点的近似解序列,称为迭代序列。

称(6)式为迭代格式,g(x)为迭代函数,而用迭代格式(6)求得方程不动点的方法,称为简单迭代法,当*∞→=x x k k lim 时,称为迭代收敛。

构造迭代函数g(x)的方法:(1)=x a x x -+2,或更一般地,对某个)(,02a x c x x c -+=≠;(2)x a x /=; (3))(21xa x x +=。

取a=3,0x =2及根*x =1.732051,给出三种情形的数值计算结果见表表 032=-x 的迭代例子问题:如何构造g(x),才能使迭代序列}{k x 一定收敛于不动点?误差怎样估计?通常通过对迭代序列}{k x 的收敛性进行分析,找出g(x)应满足的条件,从而建立一个一般理论,可解决上述问题。

二、迭代法的收敛性设迭代格式为),2,1,0()(1 ==+k x g x k k而且序列}{k x 收敛于不动点*x ,即∞→→-*k x x k (0时)因而有)3,2,1(1 =-≤-*-*k xx x x k k (7)由于),(),)((11*-*-*∈-'=-x x x x g x x k k k ξξ当g(x)满足中值定理条件时有),(),)((11*-*-*∈-'=-x x x x g x x k k k ξξ (8)注意到(8)式中只要1)(<<'L g ξ时,(7)式成立.经过上述分析知道,迭代序列的收敛性与g(x)的构造相关,只要再保证迭代值全落在[a,b]内,便得:假定迭代函数g(x)满足条件(1) 映内性:对任意x ∈[a,b]时,有a ≤g(x) ≤b ;(2) 压缩性:g(x)在[a,b]上可导,且存在正数L<1,使对任意 x ∈[a,b],有L x g <')( (9)则迭代格式)(1k k x g x =+对于任意初值0x ∈[a,b]均收敛于方程x=g(x)的根,并有误差估计式011x x LL x x kk --≤-*(10)证明 :收敛性是显然的。

数值分析C程序

数值分析C程序
b[j*n+i] = b[k*n+i];
b[k*n+i] = t;
}
}
// 为了使a的第k行的第k元素为1,a和b的第k行都除以a(k,k)
t = 1.0 / a[k*n+k];
for(i=k; i<n; i++) a[k*n+i] *= t;
for(i=0; i<n; i++) b[k*n+i] *= t;
for(i=0; i<n; i++)
{
if(i != k && a[i*n+k] != 0.0)
{
t = a[i*n+k];
for(j=k+1; j<n; j++) a[i*n+j] -= a[k*n+j] * t;
for(j=0; j<n; j++) b[i*n+j] -= b[k*n+j] * t;
// 带有列主元的约当消元法
// 功能: 求解线性方程组 Ax = b
// 参数: A - 指向n*n系数矩阵的指针
// b - 常数向量的指针
// n - 方程组的维数
// 返回值:0 - 如果成功。线性方程组的解保存在 b 中
// 1 - 求解失败
// ----------------------------------------------------------------------------
if(j != k) // 交换方程的第 j 行和 k 行
{
for(i=k; i<n; i++)

数值分析-方程迭代法

数值分析-方程迭代法

实验内容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.。

数值分析_迭代法

数值分析_迭代法

华北科技学院上机报告系(部)专业、班级姓名学号课程名称数值分析上机题目实验六,实验七任课教师指导教师成绩(优、良、中、及格、不及格)华 北 科 技 学 院 基 础 部实验六 解线性方程组的迭代法1.目的与要求:1) 熟悉求解线性方程组的有关理论哈方法。

2) 会编制雅可比迭代和高斯—塞得尔迭代法。

3) 通过实际计算,进一步了解各算法的优缺点,选择合适的数值方法。

2.雅可比迭代法算法设方程组AX=b 的系数矩阵的对角元素0(1,2,,),iii n a≠=L M 为迭代次数容许的最大值,ε为容许误差.① 取初始向量(0)(0)(0),(,,,)12Tx x x x n =L 令k=0;② 对1,2,,i n =L 计算 (1)()11();nk k ii ij j j iij ixb a x a +=≠=-∑③ 如果(1)()1,nk k iii xx ε+=-<∑则输出(1)k x+,结束;否则执行④,④ 如果,k M ≥则不收敛,终止程序;否则1,k k ←+转②.1.分别用雅可比迭代法与高斯-塞德尔迭代法解下列方程组:2),311300010000151335901100002709311000000230010793000090,00030577050200000747300012000003041007000050027270022910RI V R V =---⎡⎤⎡⎤⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥---⎢⎥⎢⎢⎥⎢==----⎢⎥⎢-⎢⎥⎢⎢⎥⎢--⎢⎥⎢--⎢⎥⎢⎢⎥⎢--⎣⎦⎣⎦其中⎥⎥⎥⎥⎥⎥⎥⎥1.用雅可比迭代法计算: #include "stdafx.h" #include "iostream.h" #include"stdio.h" #include"math.h" #include"conio.h" #include"malloc.h" #include <stdlib.h> #define EPS 1e-8 #define MAX 100float *Jacobi(float a[9][10],int n) { float *x,*y,s; double epsilon; int i,j,k=1; x=(float *)malloc(n*sizeof(float)); y=(float *)malloc(n*sizeof(float)); for(i=0;i<n;i++) x[i]=0; while(1) { k++; epsilon=0; for(i=0;i<n;i++) { s=0; for(j=0;j<n;j++) { if(j==i) continue;s=s+a[i][j]*x[j];}y[i]=(a[i][n]-s)/a[i][i];epsilon=epsilon+fabs(y[i]-x[i]);}//if (epsilon>EPS);if(k>=MAX){return y;}for(i=0;i<n;i++)x[i]=y[i];}}void main(){int i;float a[9][10]={{31,-13,0,0,0,-10,0,0,0,-15}, {-13,35,-9,0,-11,0,0,0,0,27},{0,-9,31,-10,0,0,0,0,0,-23},{0,0,-10,79,-30,0,0,0,-9,0},{0,0,0,-30,57,-7,0,-5,0,-20},{0,0,0,0,7,47,-30,0,0,12},{0,0,0,0,0,-30,41,0,0,-7},{0,0,0,0,-5,0,0,27,-2,7},{0,0,0,0,0,0,0,-2,29,-10}};float *x;x=(float *)malloc(9*sizeof(float));printf("结果为:\n");x=Jacobi(a,9);for(i=0;i<9;i++)printf("x[%d]=%f\n",i,x[i]);}程序运行结果如下:结果为:x[0]=-0.200550x[1]=0.368393x[2]=-0.731859x[3]=-0.300318x[4]=-0.446577x[5]=0.399384x[6]=0.121501x[7]=0.151792x[8]=-0.334359Press any key to continue2.用高斯-塞德尔迭代法:#include "stdafx.h"#include"stdio.h"#include"math.h"#include"conio.h"#include "iostream"#include"malloc.h"#define N 100void main(){int i;float *x;float c[90]={31,-13,0,0,0,-10,0,0,0,-15,-13,35,-9,0,-11,0,0,0,0,27,0,-9,31,-10,0,0,0,0,0,-23,0,0,-10,79,-30,0,0,0,-9,0,0,0,0,-30,57,-7,0,-5,0,-20,0,0,0,0,7,47,-30,0,0,12,0,0,0,0,0,-30,41,0,0,-7,0,0,0,0,-5,0,0,27,-2,7,0,0,0,0,0,0,0,-2,29,-10};float *GauseSeide(float *,int);x=GauseSeide(c,9);for(i=0;i<9;i++)printf("x[%d]=%f\n",i,x[i]);}float *GauseSeide(float *a,int n){int i,j,nu=0;float *x,dx,d,wucha;x=(float *)malloc(n*sizeof(float));for(i=0;i<=n-1;i++)x[i]=0.0;while(fabs(wucha)>1e-8){for(i=0;i<=n-1;i++){d=0.0;for(j=0;j<=n-1;j++)d+=*(a+i*(n+1)+j)*x[j];d=d-*(a+i*(n+1)+i)*x[i];dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));wc=x[i]-dx;x[i]=dx;}if(nu>=N){printf("迭代发散\n");exit(1);}nu++;}return x;}程序运行结果如下:x[0]=-0.200551x[1]=0.368393x[2]=-0.731860x[3]=-0.300318x[4]=-0.446577x[5]=0.399384x[6]=0.121500x[7]=0.151792x[8]=-0.334359Press any key to continue实验七方程求根1.目的与要求:1) 通过对二分法与牛顿迭代法作编程练习与上机运算,进一步体会二分法与牛顿迭代法的不同特点;2) 编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。

数值分析 数值分析 Newton迭代法求解非线性方程实验

数值分析  数值分析  Newton迭代法求解非线性方程实验
intf("%Lf\n",u[k][j]);
}//计算出u[i][j]并输出.
第二部分 for(i=k+1;i<n;i++)
{s=0.0;
for(r=0;r<k-1;r++)
{s=s+l[k][r]*u[r][k];}
l[i][k]=(a[i][k]-s)/u[k][k];
printf("%Lf\n",l[i][k]);
{s=0.0;
for(r=0;r<k-1;r++)
{s=s+l[k][r]*u[r][k];}
l[i][k]=(a[i][k]-s)/u[k][k];
printf("l[%d][%d]%Lf\n",i,k,l[i][k]);}
}
}
六、实验结果
七、上机实验体会
在这个试验中同样叶出现了很多问题,对L,U的求解输出中,输出的位置的不同,结果也就会出差错.经过多次调整,结果总算输出了.
通过此次试验,我理解了多重循环的运用,并了解了古人的聪明智慧,]讲将复杂问题简单化,现在的大学生们,应该学习他们的创新及钻研精神。
for(k=0;k<n;k++)
{for(j=k;j<n;j++)
{s=0.0;
for (r=0;r<k-1;r++)
{s=s+l[k][r]*u[r][j];}
u[k][j]=a[k][j]-s;
printf("u[%d][%d]=%Lf\n",k,j,u[k][j]); }
for(i=k+1;i<n;i++)

数值分析 迭代法 C++程序

数值分析 迭代法 C++程序

课题三解线性方程组的迭代法实验目标:分别采用Jacobi迭代法,Gauss-Seidel迭代法和SOR迭代法求解线性方程组。

Jocabi迭代法:#include<iostream>#include<math.h>using namespace std;int i,j,k; //计数器int M = 2000;int Array(double ***Arr, int n){double **p;int i;p=(double **)malloc(n*sizeof(double *));if(!p)return 0;for(i=0;i<n;i++){p[i]=(double *)malloc(n*sizeof(double));if(!p[i])return 0;}*Arr=p;return 1;}void main(){double eps ;cout<<"默认最多迭代次数为2000次"<<endl<<"迭代精度为:";cin>>eps;double **matrix;int n;cout<<"矩阵大小为:";cin>>n;double *X;X= new double[n];double *Y;Y= new double[n];double *G;G= new double[n];for(i=0;i<n;i++){Y[i]=0;}if(!Array(&matrix,n))cout<<"内存分配失败!";elsecout<<"请输入矩阵:"<<endl;for( i=0;i<n;i++){for( j=0;j<n;j++){cin>>matrix[i][j];}}cout<<"请输入右端项:"<<endl;double *B;B = new double[n];for(i=0;i<n;i++){cin>>B[i];}for (i = 0 ;i< n;i++){if (fabs(matrix[i][i]) < eps){cout <<"打印失败"<<endl;return;}double T = matrix[i][i];for ( j = 0 ; j< n;j++){matrix[i][j] = -matrix[i][j]/T;}matrix[i][i] = 0;G[i] = B[i]/T;}int counter = 0;while (counter < M){for (i = 0;i < n; i++){double temp = 0;for (j = 0;j<n; j++){temp = temp + matrix[i][j]*Y[j];}X[i] = G[i] + temp;}double temp = 0;for (i = 0 ;i< n ; i++){temp = temp + fabs(X[i] - Y[i]);}if (temp <= eps)break;else{for( i = 0; i < n ;i++){Y[i] = X[i];}}counter++;}cout << "迭代次数为:"<<counter<<"次。

一阶常微分方程数值解的C语言编程实现

一阶常微分方程数值解的C语言编程实现

一阶常微分方程数值解的C语言编程实现要编写一阶常微分方程的数值解的C语言程序,首先要理解常微分方程的概念和数值解的基本原理。

为了编写C程序实现一阶常微分方程的数值解,我们可以采用欧拉方法(Euler Method)。

该方法的迭代公式为:y(i+1) = y(i) + h *f(x(i), y(i)),其中i表示当前步数,h是步长。

下面是实现一阶常微分方程数值解的C语言程序的详细步骤:1. 确定常微分方程的形式,例如:dy/dx = x + y,可以通过修改f 函数来改变所求的常微分方程。

2. 导入需要的头文件,即stdio.h。

3. 编写函数f,根据常微分方程的形式计算dy/dx的值。

该函数接受两个参数x和y,返回dy/dx的值。

例如,对于上述例子,f函数可以写为:float f(float x, float y) { return x + y; }4. 编写主函数main,首先声明需要使用的变量,包括x的区间起止点xa和xb,步长h,以及迭代次数n。

另外,还需要声明变量x和y作为迭代过程中的中间变量。

5. 通过用户输入获取xa、xb、h和n的值,例如:printf("Enter the initial value of x (xa): "); scanf("%f", &xa);6. 计算x的区间个数:num = (xb - xa) / h。

7. 设置初始值:x = xa,y = 初始y值,例如:y = 0.0。

8. 使用for循环进行迭代,迭代次数为n。

在每次迭代中,计算dy/dx的值:k = f(x, y),并更新x和y的值:x = x + h,y = y + h * k。

9. 输出最终的数值解,例如:printf("The numerical solution of the differential equation is: %f\n", y)。

迭代法

迭代法

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。

迭代算法是用计算机解决问题的一种基本方法,它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值,迭代法又分为精确迭代和近似迭代。

比较典型的迭代法如“二分法”和"牛顿迭代法”属于近似迭代法。

方法介绍迭代法是一类利用递推公式或循环算法通过构造序列来求问题近似解的方法。

例如,对非线性方程,利用递推关系式,从开始依次计算,来逼近方程的根的方法,若仅与有关,即,则称此迭代法为单步迭代法,一般称为多步迭代法;对于线性方程组,由关系从开始依次计算来过近方程的解的方法。

若对某一正整数,当时,与k 无关,称该迭代法为定常迭代法,否则称之为非定常迭代法。

称所构造的序列为迭代序列。

迭代法应用迭代法的主要研究课题是对所论问题构造收敛的迭代格式,分析它们的收敛速度及收敛范围。

迭代法的收敛性定理可分成下列三类:①局部收敛性定理:假设问题解存在,断定当初始近似与解充分接近时迭代法收敛;②半局部收敛性定理:在不假定解存在的情况下,根据迭代法在初始近似处满足的条件,断定迭代法收敛于问题的解;③大范围收敛性定理:在不假定初始近似与解充分接近的条件下,断定迭代法收敛于问题的解。

迭代法在线性和非线性方程组求解,最优化计算及特征值计算等问题中被广泛应用。

迭代法算法迭代是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或者方程组)的过程,为实现这一过程所使用的方法统称为迭代法(Iterative Method)。

一般可以做如下定义:对于给定的线性方程组(这里的x、B、f同为矩阵,任意线性方程组都可以变换成此形式),用公式(代表迭代k次得到的x,初始时k=0)逐步带入求近似解的方法称为迭代法(或称一阶定常迭代法)。

C语言迭代法详细讲解

C语言迭代法详细讲解

迭代法迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。

迭代法又分为精确迭代和近似迭代。

“二分法”和“牛顿迭代法”属于近似迭代法。

迭代算法是用计算机解决问题的一种基本方法。

它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

利用迭代算法解决问题,需要做好以下三个方面的工作:一、确定迭代变量。

在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

二、建立迭代关系式。

所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。

迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

三、对迭代过程进行控制。

在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。

不能让迭代过程无休止地重复执行下去。

迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。

对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

例 1 :一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。

如果所有的兔子都不死去,问到第12 个月时,该饲养场共有兔子多少只?分析:这是一个典型的递推问题。

我们不妨假设第 1 个月时兔子的只数为u 1 ,第 2 个月时兔子的只数为u 2 ,第 3 个月时兔子的只数为u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有u 1 = 1 ,u 2 =u 1 +u 1 ×1 = 2 ,u 3 =u 2 +u 2 ×1= 4 ,……根据这个规律,可以归纳出下面的递推公式:u n =u n - 1 × 2 (n ≥ 2)对应u n 和u n - 1 ,定义两个迭代变量y 和x ,可将上面的递推公式转换成如下迭代关系:y=x*2x=y让计算机对这个迭代关系重复执行11 次,就可以算出第12 个月时的兔子数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

cin>>n;
{
double *X;
matrix[i][j] = -matrix[i][j]/T;
X= new double[n];
double *Y;
}
Y= new double[n];
matrix[i][i] = 0;
double *G;
G[i] = B[i]/T;
G= new double[n];
#include<iostream>
#include<math.h>
using namespace std;
int i,j,k;
//计数器
int M = 2000;
int Array(double ***Arr, int n){
double **p;
int i;
p=(double **)malloc(n*sizeof(double *));
Y[i] = X[i]; } } counter++; } cout << "迭代次数为:"<<counter<<"次。该线性 方程组的解(X1,X2,X3......Xn)为:"<<endl; for( i = 0; i < n ;i++) {
cout << X[i] <<" ";
}
}
SOR 迭代法:
cout<<"默认最多迭代次数为2000次"<<endl<<"迭
{
代精度为:";
cout <<"打印失败"<<endl;
cin>>eps;
return;
double **matrix;
}
int n;
double T = matrix[i][i];
cout<<"矩阵大小为:";
for ( j = 0 ; j< n;j++)
代精度为:";
cin>>eps;
double **matrix;
int n; cout<<"矩阵大小为:"; cin>>n; double *X; X= new double[n]; double *Y; Y= new double[n]; double *G; G= new double[n];
for(i=0;i<n;i++){ Y[i]=0; } if(!Array(&matrix,n)) cout<<"内存分配失败!"; else cout<<"请输入矩阵:"<<endl; for( i=0;i<n;i++){
if(!p)return 0;
for(i=0;i<n;i++)
{
p[i]=(double *)malloc(n*sizeof(double));
if(!p[i])return 0;
}
*Arr=p;
return 1;
}
void main()
{
double eps ;
cout<<"默认最多迭代次数为2000次"<<endl<<"迭
temp = temp + matrix[i][j]*X[j]; } X[i] = G[i] + temp; } double temp = 0; for (i = 0 ;i< n ; i++) { temp = temp + fabs(X[i] - Y[i]); } //cout<<temp<<" "; if (temp <= eps) break; else { for( i = 0; i < n ;i++) {
p=(double **)malloc(n*sizeof(doublex[i][j];
if(!p)return 0;
}
for(i=0;i<n;i++)
}
{
p[i]=(double *)malloc(n*sizeof(double)); cout<<"请输入右端项:"<<endl;
double temp = 0; for (i = 0 ;i< n ; i++) {
temp = temp + fabs(X[i] - Y[i]); } if (temp <= eps)
break; else
{ for( i = 0; i < n ;i++) { Y[i] = X[i]; }
} counter++; } cout << "迭代次数为:"<<counter<<"次。该线性 方程组的解(X1,X2,X3......Xn)为:"<<endl; for( i = 0; i < n ;i++) { cout << X[i] <<" "; }
}
int counter = 0;
for(i=0;i<n;i++){
while (counter < M)
{ for (i = 0;i < n; i++) { double temp = 0; for (j = 0;j<n; j++) { temp = temp + matrix[i][j]*Y[j]; } X[i] = G[i] + temp; }
double temp = 0; for (j = 0;j<n; j++) {
temp = temp + matrix[i][j]*X[j]; } X[i] = G[i] + temp; } double temp = 0; for (i = 0 ;i< n ; i++) { temp = temp + fabs(X[i] - Y[i]); } if (temp <= eps) break; else { //交?换?X,ê?Y向¨°量¢?;ê? for( i = 0; i < n ;i++) {
for(i=0;i<n;i++){ Y[i]=0;
} if(!Array(&matrix,n))
cout<<"内存分配失败!"; else cout<<"请输入矩阵:"<<endl;
for( i=0;i<n;i++){ for( j=0;j<n;j++){ cin>>matrix[i][j]; }
}
}
Gauss-Seidel 迭代法:
#include<iostream>
#include<math.h>
using namespace std;
int i,j,k;
//计数器
int M = 2000;
int Array(double ***Arr, int n){
double **p;
int i;
p=(double **)malloc(n*sizeof(double *)); if(!p)return 0; for(i=0;i<n;i++) {
if(!p[i])return 0;
double *B;
}
B = new double[n];
*Arr=p;
for(i=0;i<n;i++){
return 1;
cin>>B[i];
}
}
void main()
for (i = 0 ;i< n;i++)
{
{
double eps ;
if (fabs(matrix[i][i]) < eps)
p[i]=(double *)malloc(n*sizeof(double)); if(!p[i])return 0; } *Arr=p;
return 1; } void main() {
double eps ; cout<<"默认最多迭代次数为2000次"<<endl<<"迭 代精度为:"; cin>>eps; double **matrix; int n; cout<<"矩阵大小为:"; cin>>n; double *X; X= new double[n]; double *Y; Y= new double[n]; double *G; G= new double[n];
int i,j,k;
//计数器
cout<<"内存分配失败!";
int M = 2000;
else
int Array(double ***Arr, int n){
cout<<"请输入矩阵:"<<endl;
double **p;
for( i=0;i<n;i++){
相关文档
最新文档