数值分析编程总结
- 格式:doc
- 大小:58.50 KB
- 文档页数:14
第3章矩阵特征值与特征向量的计算--------学习小结一、本章学习体会通过本章的学习,我知道了求矩阵的特征值和特征向量的问题是代数计算的重要课题,在这一章,我了解到了直接计算矩阵的特征值和特征向量的MATLAB程序、间接计算矩阵的特征值和特征向量的幂法、反幂法、Jacobi方法、QR方法及MATLAB计算程序。
我了解到自己对数值分析及MATLAB的掌握还很肤浅,了解到了自己的不足,同时意识到自己知识点薄弱的地方,还有对知识的理解有偏差。
有的知识点理解的不透彻,自己可以动手做题,但编程实现还需要一定的编程语言知识以及数学知识和机器语言之间的转换。
四种方法各有其特点和适用范围。
幂法主要用于计算矩阵按模最大的特征值及其相应的特征向量;反幂法主要用于计算矩阵按模最小的特征值及其相应的特征向量;Jacobi方法用于求实对称矩阵的全部特征值和特征向量的方法;QR方法则适用于计算一般实矩阵的全部特征值,尤其适用于计算中小型实矩阵的全部特征值。
归结起来,这四种方法亦有其共同点,那就是都是用了迭代的方法来求矩阵的特征值和特征向量。
此外,用MATLAB自带的解法求解特征值和特征向量也非常快速,而且不用编辑函数建立m文件。
二、本章知识梳理本章对于矩阵的特征值和特征向量的算法提出了新的思路,如幂法和反幂法、Jacobi 、QR 方法等。
本章的小结主要从方法的思想,以及一些定理展开。
以下是各种方法的运用范围1、幂法:主要用于计算矩阵按模最大的特征值和其相应的特征向量;2、反幂法:主要计算矩阵按模最小的特征值以及其相应的特征向量;3、Jacobi 方法:用于求实对称矩阵的全部特征值和特征向量的方法;4、QR 方法:适用于计算一般实矩阵的全部特征值,尤其适用于计算中小型实矩阵的全部特征值。
3.1幂法与反幂法一、乘幂法1、基本思想])([2111101∑=-+===n i i k i i kk k k X X u A u A u λλααλ 2、一般算法1)任意给定初始向量;0n R u ∈2)对于k=1,2,...111---=k k k u u y 1-=k k y A u 1111X X y k αα→ 3)如果ε<--1k k u u ,则,,1,1m k m k u u -≈λk u X ≈13、三种迭代公式(1)使用范数2•(2)使用范数∞•(3))max (k u 表示k u 的绝对值最大的分量。
#include <stdio.h>#include <math.h>double f(double x){double ans;ans=exp(x);return ans;}void main(){double a=1,b=3,error=0.0001,t[20][20],h,c;int i,j,k,m,n;h=b-a;2;t[0][0]=h*(f(a)+f(b))/k=1;while(1){t[0][k]=0;m=1;for(j=0;j<k-1;j++)m=m*2;for(i=1;i<=m;i++)t[0][k]=t[0][k]+h*f(a+(i-0.5)*h);2;t[0][k]=(t[0][k]+t[0][k-1])/for(j=1;j<=k;j++){ c=1;for(n=0;n<j;n++)c=c*4;t[j][k-j]=(c*t[j-1][k-j+1]-t[j-1][k-j])/(c-1);}if(fabs(t[k][0]-t[k-1][0])<error){ printf("\n积分结果 I ≈ %lf\n",t[k][0]);break;}else{ h=h/2;k++;}}}#include <stdio.h>#include <math.h>double f(double t){double ans;ans=pow(cos(t),1.0/3);return ans;}void main(){double x=0,eslong=0.000001,x0;int N=20,i;printf("\n近似初值 x0 = %lf\n",x);for(i=0;i<N;i++){x0=x;x=f(x);printf(" x%d = %lf\n",i+1,x);if(fabs(x-x0)<eslong)break;}if(fabs(x-x0)<eslong)得到近似结果为 x ≈ %lf\n\n",x,i);printf("elseprintf("迭代失败\n");}#include <stdio.h>#include <math.h>double a=0,b=1,x,y=0,h=0.1,k1,k2,k3,k4;int i,N;double f(double t,double s){double ans;ans=1+t*t;return ans;}void main(){N=(b-a)/h;x=a;初值为 (x0,y0) = ( %.8f , %.8f )\n",x,y);printf("\nfor(i=0;i<N;i++){k1=f(x,y);k2=f(x+h/2,y+h*k1/2);k3=f(x+h/2,y+h*k2/2);k4=f(x+h,y+h*k3);6;y=y+h*(k1+2*(k2+k3)+k4)/x=x+h;第%d次输出结果为 (x%d,y%d) = ( %.8f , %.8f )\n",i+1,i+1,i+1,x,y);printf("}}#include <stdio.h>void main(){double datax[4]={1.2,2.9,4.6,5.8},datay[10]={14.84,33.71,58.36,79.24},l[3],x=1.5,y;int i,j;y=0;for(i=0;i<=3;i++){l[i]=1;for(j=0;j<i;j++)l[i]=(x-datax[j])/(datax[i]-datax[j])*l[i];for(j=i+1;j<=3;j++)l[i]=(x-datax[j])/(datax[i]-datax[j])*l[i];y=y+datay[i]*l[i];}在 x = %f 处的近似值为: y = %f\n",x,y);printf("\n f(x)}#include <stdio.h>void main(){double datay[9]={11.7,14.87,21.44,31.39,44.73,61.46,81.57,105.11,131.91};int m=2,i,j,k;double p,data[9][4],a[3][4],datax[9]={1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,10.0};for(i=0;i<9;i++)for(j=1;j<2*m+1;j++){data[i][j]=1;for(k=0;k<j;k++)data[i][j]=data[i][j]*datax[i];}for(i=0;i<m+1;i++){for(j=0;j<m+1;j++){a[i][j]=0;for(k=0;k<9;k++)a[i][j]=a[i][j]+data[k][i+j];}}a[0][0]=9;a[0][m+1]=0;for(i=0;i<9;i++)a[0][m+1]=a[0][m+1]+datay[i];for(i=1;i<m+1;i++){ a[i][m+1]=0;for(j=0;j<9;j++){p=datay[j];for(k=0;k<i;k++)p=p*datax[j];a[i][m+1]=a[i][m+1]+p;}} //生成m+1行,m+2列增广矩阵////显示方程组//for(i=0;i<m+1;i++)for(j=0;j<m+2;j++){if(j!=m+1){ printf("(%f)a%d ",a[i][j],j);if(j!=m)printf("+ ");}elseprintf("= %f \n",a[i][j]);}//高斯消去法//for(i=0;i<m;i++){if(a[i][i]!=0){ for(j=i+1;j<m+1;j++){ a[j][i]=a[j][i]/a[i][i];for(k=i+1;k<m+2;k++)a[j][k]=a[j][k]-a[i][k]*a[j][i];}}elsebreak;}if(a[m][m]!=0&&i==m){ a[m][m+1]=a[m][m+1]/a[m][m];for(i=2;i<=m+1;i++){ for(j=1;j<i;j++)a[m+1-i][m+1]=a[m+1-i][m+1]-a[m+1-i][m+1-j]*a[m+1-j][m+1];a[m+1-i][m+1]=a[m+1-i][m+1]/a[m+1-i][m+1-i];}方程组的解为:\n");printf("for(j=0;j<m+1;j++)printf("a%d = %f\n",j,a[j][m+1]);拟合多项式为:\n");printf("printf("P%d(x) = (%f) + (%f)x + (%f)x^2\n",m,a[0][m+1],a[1][m+1],a[2][m+1]);}else数据有误!\n");printf("}}列主元素法#include <stdio.h>#include <math.h>void main(){double a[3][4]={1,-2,-1,3,-2,10,-3,15,-1,-2,5,10},mov,comp;int i,j,k,nrow;for(i=0;i<2;i++){comp=fabs(a[i][i]);for(k=i;k<3;k++)//比较绝对值大小并进行主元列交换//if(fabs(a[k][i])>=comp){nrow=k;comp=fabs(a[k][i]);}for(j=0;j<=3;j++){mov=a[i][j];a[i][j]=a[nrow][j];a[nrow][j]=mov;}方程第%d行互换位置后如下\n",i+1);printf("for(j=0;j<3;j++)printf("(%f)x1 + (%f)x2 + (%f)x3 = %f\n",a[j][0],a[j][1],a[j][2],a[j][3]);if(a[i][i]!=0){for(j=i+1;j<3;j++){a[j][i]=a[j][i]/a[i][i];for(k=i+1;k<=3;k++)a[j][k]=a[j][k]-a[i][k]*a[j][i];a[j][i]=0;}方程经%d次消元如下\n",i+1);printf("for(j=0;j<3;j++)printf("(%f)x1 + (%f)x2 + (%f)x3 = %f\n",a[j][0],a[j][1],a[j][2],a[j][3]);elsebreak;}if(a[2][2]!=0&&i==2){方程化简得\n");printf("for(i=0;i<3;i++)printf("(%f)x1 + (%f)x2 + (%f)x3 = %f\n",a[i][0],a[i][1],a[i][2],a[i][3]);a[2][3]=a[2][3]/a[2][2];for(i=2;i<=3;i++){for(j=1;j<i;j++)a[3-i][3]=a[3-i][3]-a[3-i][3-j]*a[3-j][3];a[3-i][3]=a[3-i][3]/a[3-i][3-i];}方程组的解为:\n");printf("for(j=0;j<3;j++)printf("x%d = %f\n",j+1,a[j][3]);}elseprintf("数据有误!\n");}#include <stdio.h>#include <math.h>void main(){double a[3][7]={{1,-2,-1,3},{-2,10,-3,15},{-1,-2,5,10}},error=0.000001,norm;int N=423,i,j,k;a[0][4]=0,a[1][4]=0,a[2][4]=0;//把a矩阵转化为b矩阵//for(i=0;i<3;i++){a[i][6]=a[i][i];for(j=0;j<3;j++){a[i][j]=-a[i][j]/a[i][6];}a[i][3]=a[i][3]/a[i][6];a[i][i]=0;}化为b矩阵如下\n");printf("for(i=0;i<3;i++){printf("%f %f %f %f\n",a[i][0],a[i][1],a[i][2],a[i][3]);}for(i=1;i<N;i++){for(j=0;j<3;j++){a[j][5]=0;for(k=0;k<3;k++){a[j][5]=a[k][4]*a[j][k]+a[j][5];}a[j][5]=a[j][5]+a[j][3];}norm=0;for(k=0;k<3;k++)norm=norm+fabs(a[k][4]-a[k][5]);if(norm<error)break;elsefor(k=0;k<3;k++)a[k][4]=a[k][5];}if(norm<error){计算结果为\n");printf("for(i=0;i<3;i++){printf(" x%d = %.3f\n",i+1,a[i][5]);}}elseprintf("迭代失败\n");}题目1#include "stdio.h"#include "math.h"double f(double x){double ans;ans=exp(x);return(ans);}void main(){double a=-1,b=1,error=0.0001,m=1,h,T0,T,F;int k;h=(b-a)/2;T0=h*(f(a)+f(b));while(1){F=0;for(k=1;k<=pow(2.0,m-1);k++)F=F+f(a+(2*k-1)*h);T=T0/2+h*F;if(fabs(T-T0)<error)break;m++;h=h/2;T0=T;}printf("积分结果为I ≈ %f\n",T);}#include "stdio.h"double f(double t,double s){double ans;ans=1+t*t;return(ans);}void main(){double a=0,b=1,h=0.2,x0=0,y0=0,x,k1,k2,k3,y;int N,n;N=(b-a)/h;for(n=1;n<=N;n++){x=x0+h;k1=f(x0,y0);k2=f(x0+h/2,y0+h/2*k1);k3=f(x0+h,y0-h*k1+2*h*k2);y=y0+h/6*(k1+4*k2+k3);第%d次输出结果为(%.8f,%.8f)\n",n,x,y);printf("x0=x;y0=y;}}。
第1篇在数值分析这门课程的学习过程中,我深刻体会到了理论知识与实践操作相结合的重要性。
通过一系列的实验,我对数值分析的基本概念、方法和应用有了更加深入的理解。
以下是我对数值分析实验的心得体会。
一、实验目的与意义1. 巩固数值分析理论知识:通过实验,将课堂上学到的理论知识应用到实际问题中,加深对数值分析概念和方法的理解。
2. 培养实际操作能力:实验过程中,我学会了使用Matlab等软件进行数值计算,提高了编程能力。
3. 增强解决实际问题的能力:实验项目涉及多个领域,通过解决实际问题,提高了我的问题分析和解决能力。
4. 培养团队协作精神:实验过程中,我与同学们分工合作,共同完成任务,培养了团队协作精神。
二、实验内容及方法1. 实验一:拉格朗日插值法与牛顿插值法(1)实验目的:掌握拉格朗日插值法和牛顿插值法的原理,能够运用这两种方法进行函数逼近。
(2)实验方法:首先,我们选择一组数据点,然后利用拉格朗日插值法和牛顿插值法构造插值多项式。
最后,我们将插值多项式与原始函数进行比较,分析误差。
2. 实验二:方程求根(1)实验目的:掌握二分法、Newton法、不动点迭代法、弦截法等方程求根方法,能够运用这些方法求解非线性方程的根。
(2)实验方法:首先,我们选择一个非线性方程,然后运用二分法、Newton法、不动点迭代法、弦截法等方法求解方程的根。
最后,比较不同方法的收敛速度和精度。
3. 实验三:线性方程组求解(1)实验目的:掌握高斯消元法、矩阵分解法等线性方程组求解方法,能够运用这些方法求解线性方程组。
(2)实验方法:首先,我们构造一个线性方程组,然后运用高斯消元法、矩阵分解法等方法求解方程组。
最后,比较不同方法的计算量和精度。
4. 实验四:多元统计分析(1)实验目的:掌握多元统计分析的基本方法,能够运用这些方法对数据进行分析。
(2)实验方法:首先,我们收集一组多元数据,然后运用主成分分析、因子分析等方法对数据进行降维。
数值分析编程总结.1. LU分解:[L U]=lu(A);2. 追赶法function x=zhuiganfa(A,b)[n,n]=size(A); for i=1:n if(i==1) l(i)=A(i,i); y(i)=b(i)/l(i); else l(i)=A(i,i)-[L U]=lu(A);2. 追赶法function x=zhuiganfa(A,b)[n,n]=size(A); for i=1:n if(i==1) l(i)=A(i,i); y(i)=b(i)/l(i); else l(i)=A(i,i):xi19531964198219902000yi5.826.9510.0811.3412.66要拟合的函数为:y=a+bx-y=a+bx:function z = erchen(x,y)x1=ones(5,1); A=[x1,x,-x.*y]; 注意点乘z=A\y; 注意左除a=z(1);b=z(2);c=z(3);end 输入:≻≻x=[1953 1964 1982 1990 2000]';≻≻y=[5.82 6.95 10.08 11.34 12.66]';≻≻erchen(x,y)ans = 2.9456 =a -≻≻x=[1953 1964 1982 1990 2000]';≻≻ y=[5.82 6.95 10.08 11.34 12.66]';≻≻ erchen(x,y)ans = 2.9456 =a :function v = f( x,y)v=-y+x+1;end2. 定义欧拉公式编程:function [x,y] = oula( f,y0,a,b,n )y(1)=y0;h=(b-function [x,y] = oula( f,y0,a,b,n )y(1)=y0;h=(b:function v = f( x,y)v=-y+x+1;end要先运行一下。
数值分析编程报告思源1201班12274005刘家玮列主消元法解方程一、解题方法的理论依据列主消元法和高斯消元法接方程的基本思想是一致的,唯一不同的是:在把方程组的增广矩阵化成上三角矩阵的时候,高斯消元法用的是高斯消元法,即不交换仍和行列的秩序,一次一行一行消元。
而列主消元法是在高斯消元法的基础上,增加了一个步骤,即在消元前看主元在该列中的绝对值是否为最大,若最大,则进行消元,若不是,则进行行交换,保证每次消元时主元的绝对值在该行中最大。
此目的是为了控制消元时引起的误差。
计算公式:x i =1/a ii (i)[b i (i)-∑+=ni j 1j (i)ij x a ],i=n,n-1,…,1a 为方程的系数矩阵,b 为方程右边的矩阵公式中以n 阶为例。
二、程序设计思路及计算程序 2 设计思路2、计算程序 #include"stdio.h" #include"math.h" main() {int i,j,k,m,h,max;double x[9],l,x0=0,t=0,sum=0; 定义变量 doubleb[9]={2.1874369,33.992318,-25.173417,0.84671695,1.784317,-86.612343,1.1101230,4.719345,-5.6784392},A[9][9]={{12.38412 ,2.115237 ,-1.061704,1.112336 ,-0.113584,0.718719 ,1.742382 ,3.067813 , -2.031743},{2.115237 ,19.141823,-3.125432,-1.012345,2.189736 ,1.563849 ,-0.784165 ,1.112348 ,3.123124 },{-1.061074,-3.125432,15.567914,3.123848 ,2.031454 ,1.836742 ,-1.056781 ,0.336993 ,-1.010103 },{1.112336 ,-1.012345,3.123848 ,27.108437,4.101011 ,-3.741856,2.101023 ,-0.71828 ,-0.037585 },{-0.113584,2.189736 ,2.031454 ,4.010111 ,19.897918,0.431637 ,-3.111223 ,2.121314 ,1.784317 } ,{0.718719 ,1.563849 ,1.836742 ,-3.741856,0.431637 ,9.789365 ,-0.103458 ,-1.103456,0.238417 } ,{1.742382 ,-0.784165,-1.056781,2.101023 ,-3.111223,-0.103458,14.7138465,3.123789 ,-2.21347 4},{3.067813 ,1.112348 ,0.336993 ,-0.71828 ,2.121314 ,-1.103456,3.123789 ,30.719334,4.446782 },{-2.031743,3.123124 ,-1.010103,-0.037585,1.784317 ,0.238417 ,-2.213474 ,4.446782 ,40.00001 } };for(j=0;j<=7;j++){max=j;for(m=j;m<=7;m++) 找出最大绝对值行元素所在的行标{if(fabs(A[max][j])-fabs(A[m+1][j])>=0) h=max;else max=h=m+1;}for(m=j;m<=8;m++){t=A[j][m];sum=b[j];A[j][m]=A[h][m]; 行交换,保证消元时主元的绝对值在该列为最大A[h][m]=t;b[j]=b[h];b[h]=sum;}for(i=j+1;i<=8;i++){l=A[i][j]/A[j][j]; 算出消元系数for(k=j;k<=8;k++) 消元A[i][k]=A[i][k]-l*A[j][k];b[i]=b[i]-l*b[j];}}for(i=8;i>=0;i--) 求出方程组的解{for(j=i+1;j<=8;j++)x0=x0+A[i][j]*x[j];x[i]=1.0/A[i][i]*(b[i]-x0);x0=0.0;}printf("The result is:\n"); 打印出结果for(i=0;i<=8;i++)printf("%lf\n",x[i]);}三、计算结果列主消元法的结果松弛法迭代9次时的值松弛法迭代20次时的值四、问题讨论由于本程序循环中数组的下标对应比较复杂,在调试的过程中飞了不少劲,最后通过手动一层层的推导才得出了正确的对应关系的。
一、实验背景数值分析是研究数值计算方法及其理论的学科,是计算机科学、数学、物理学等领域的重要基础。
为了提高自身对数值分析理论和方法的理解,我们进行了数值分析实验,通过实验加深对理论知识的掌握,提高实际操作能力。
二、实验目的1. 理解数值分析的基本理论和方法;2. 掌握数值分析实验的基本步骤和技巧;3. 培养实验设计和数据分析能力;4. 提高编程和计算能力。
三、实验内容本次实验主要分为以下几个部分:1. 线性方程组求解实验:通过高斯消元法、LU分解法等求解线性方程组,并分析算法的稳定性和误差;2. 矩阵特征值问题计算实验:利用幂法、逆幂法等计算矩阵的特征值和特征向量,分析算法的收敛性和精度;3. 非线性方程求根实验:运用二分法、牛顿法、不动点迭代法等求解非线性方程的根,比较不同算法的优缺点;4. 函数插值实验:运用拉格朗日插值、牛顿插值等方法对给定的函数进行插值,分析插值误差;5. 常微分方程初值问题数值解法实验:运用欧拉法、改进的欧拉法、龙格-库塔法等求解常微分方程初值问题,比较不同算法的稳定性和精度。
四、实验过程1. 线性方程组求解实验:首先,编写程序实现高斯消元法、LU分解法等算法;然后,对给定的线性方程组进行求解,记录计算结果;最后,分析算法的稳定性和误差。
2. 矩阵特征值问题计算实验:编写程序实现幂法、逆幂法等算法;然后,对给定的矩阵进行特征值和特征向量的计算,记录计算结果;最后,分析算法的收敛性和精度。
3. 非线性方程求根实验:编写程序实现二分法、牛顿法、不动点迭代法等算法;然后,对给定的非线性方程进行求根,记录计算结果;最后,比较不同算法的优缺点。
4. 函数插值实验:编写程序实现拉格朗日插值、牛顿插值等方法;然后,对给定的函数进行插值,记录计算结果;最后,分析插值误差。
5. 常微分方程初值问题数值解法实验:编写程序实现欧拉法、改进的欧拉法、龙格-库塔法等算法;然后,对给定的常微分方程初值问题进行求解,记录计算结果;最后,比较不同算法的稳定性和精度。
数值分析总结数值分析是一门应用数学的学科,它的目标是使用数值方法来解决数学问题,尤其是那些难以使用解析方法求解的问题。
通过使用计算机来计算近似解,数值分析提供了一种实用而有效的解决方案。
在本文中,我将对我在学习数值分析过程中的一些主要收获进行总结。
一、数值方法的重要性数值方法不仅在科学计算中起着重要作用,而且在工程和实际应用领域也有广泛的应用。
无论是模拟天气预报、设计飞机的机翼,还是分析金融市场的波动,数值分析都可以提供快速、准确的结果。
因此,掌握数值方法成为了现代科学与工程领域必备的技能之一。
二、数值计算的误差与稳定性在数值计算中,我们经常会面对误差的问题。
舍入误差、截断误差和舍入误差都是我们需要关注的。
舍入误差是由于计算机在进行浮点数计算时的有限精度而引入的,而截断误差则是由于将无限精度的数学问题转化为有限精度计算引起的。
为了减小误差,我们可以使用舍入规则,并尽可能减小截断误差。
稳定性是另一个需要考虑的重要因素。
在一些计算中,输入数据的微小变化可能会导致输出结果的巨大变化。
这种情况下,我们说该算法是不稳定的。
为了确保计算的稳定性,我们需要选择合适的算法和数据结构,并且要进行合理的数值分析。
三、插值和拟合插值和拟合是数值分析的重要应用之一。
在实际问题中,我们往往只能够获得有限个数据点,但是我们需要获得一条曲线或函数来描述这些数据。
插值方法可以通过连接这些数据点来获得平滑的曲线,而拟合方法则通过选择一个合适的函数来逼近数据点。
在实际应用中,我们需要根据具体问题选择合适的插值和拟合方法,并进行适当的调整和优化。
四、求解非线性方程求解非线性方程是数值分析中的一个重要问题。
在实际应用中,很多问题都可以归纳为求解非线性方程。
例如,求解光学系统中的折射问题、解微分方程等。
数值分析提供了多种求解非线性方程的方法,如牛顿法、二分法、割线法等。
这些方法有着各自的特点和适用范围,我们需要根据问题的性质选择合适的方法。
一、实习背景数值分析是数学的一个重要分支,它研究如何用数值方法求解数学问题。
随着计算机技术的飞速发展,数值分析在各个领域得到了广泛的应用。
为了提高自己的实践能力,我选择了数值分析作为实习课题,希望通过这次实习,能够掌握数值分析的基本方法,并将其应用于实际问题中。
二、实习过程1. 实习初期在实习初期,我首先了解了数值分析的基本概念、理论和方法。
通过阅读相关教材和文献,我对数值分析有了初步的认识。
接着,我学习了数值分析的基本方法,如泰勒展开、牛顿法、高斯消元法等。
2. 实习中期在实习中期,我选择了几个实际问题进行数值计算。
首先,我使用泰勒展开法求解一个简单的微分方程。
通过编写程序,我得到了微分方程的近似解。
然后,我运用牛顿法求解一个非线性方程组。
在实际计算过程中,我遇到了一些问题,如收敛性、迭代次数过多等。
通过查阅资料和请教导师,我找到了解决方法,成功求解了方程组。
3. 实习后期在实习后期,我进一步学习了数值分析的高级方法,如复化梯形公式、复化Simpson公式、自适应梯形法等。
这些方法在解决实际问题中具有更高的精度和效率。
我选择了一个具体的工程问题,运用复化梯形公式求解定积分。
在计算过程中,我遇到了区间细分、精度控制等问题。
通过不断尝试和调整,我得到了较为精确的积分值。
三、实习收获与体会1. 理论与实践相结合通过这次实习,我深刻体会到理论与实践相结合的重要性。
在实习过程中,我不仅学习了数值分析的理论知识,还将其应用于实际问题中。
这使我更加深刻地理解了数值分析的基本方法,提高了自己的实践能力。
2. 严谨的学术态度在实习过程中,我养成了严谨的学术态度。
在编写程序、进行数值计算时,我注重细节,力求精确。
这使我更加注重学术规范,提高了自己的学术素养。
3. 团队合作精神实习过程中,我与其他同学进行了交流与合作。
在解决实际问题时,我们互相学习、互相帮助,共同完成了实习任务。
这使我更加懂得团队合作的重要性,提高了自己的团队协作能力。
第一章 绪论误差来源:模型误差、观测误差、截断误差(方法误差)、舍入误差ε(x )=|x −x ∗|是x ∗的绝对误差,e =x ∗−x 是x ∗的误差,ε(x )=|x −x ∗|≤ε,ε为x ∗的绝对误差限(或误差限) e r =ex =x ∗−x x为x ∗ 的相对误差,当|e r |较小时,令 e r =ex ∗=x ∗−x x ∗相对误差绝对值得上限称为相对误差限记为:εr 即:|e r |=|x ∗−x||x ∗|≤ε|x ∗|=εr绝对误差有量纲,而相对误差无量纲若近似值x ∗的绝对误差限为某一位上的半个单位,且该位直到x ∗的第一位非零数字共有n 位,则称近似值 x ∗有n 位有效数字,或说 x ∗精确到该位。
例:设x=π=3.1415926…那么x ∗=3,ε1(x )=0.1415926…≤0.5×100,则x ∗有效数字为1位,即个位上的3,或说 x ∗精确到个位。
科学计数法:记x ∗=±0.a 1a 2⋯a n ×10m (其中a 1≠0),若|x −x ∗|≤0.5×10m−n ,则x ∗有n 位有效数字,精确到10m−n 。
由有效数字求相对误差限:设近似值x ∗=±0.a 1a 2⋯a n ×10m (a 1≠0)有n 位有效数字,则其相对误差限为12a 1×101−n由相对误差限求有效数字:设近似值x ∗=±0.a 1a 2⋯a n ×10m (a 1≠0)的相对误差限为为12(a 1+1)×101−n 则它有n 位有效数字令x ∗、y ∗是x 、y 的近似值,且|x ∗−x|≤η(x )、|y ∗−y|≤η(y)1. x+y 近似值为x ∗+y ∗,且η(x +y )=η(x )+η(y )和的误差(限)等于误差(限)的和2. x-y 近似值为x ∗−y ∗,且η(x +y )=η(x )+η(y )3. xy 近似值为x ∗y ∗,η(xy )≈|x ∗|∗η(y )+|y ∗|∗η(x)4. η(xy )≈|x ∗|∗η(y )+|y ∗|∗η(x)|y ∗|21.避免两相近数相减2.避免用绝对值很小的数作除数 3.避免大数吃小数 4.尽量减少计算工作量 第二章 非线性方程求根1.逐步搜索法设f (a ) <0, f (b )> 0,有根区间为 (a , b ),从x 0=a 出发, 按某个预定步长(例如h =(b -a )/N )一步一步向右跨,每跨一步进行一次根的搜索,即判别f (x k )=f (a +kh )的符号,若f (x k )>0(而f (x k -1)<0),则有根区间缩小为[x k -1,x k ] (若f (x k )=0,x k 即为所求根), 然后从x k -1出发,把搜索步长再缩小,重复上面步骤,直到满足精度:|x k -x k -1|< 为止,此时取x *≈(x k +x k -1)/2作为近似根。
数值分析学习心得体会前言在学习数值分析课程的过程中,我深深地感受到了数值分析方法的魅力。
在这门课程中,我不仅学习了许多数值计算的方法,还深入了解了计算机科学的相关知识,同时,也收获了很多关于科学与工程计算的经验和技巧。
在我的学习过程中,我积累了许多心得和体会,现在,我想与大家分享一些自己的感受和思考。
重视实践,加强编程能力数值分析是一门理论与实践相结合的学科。
虽然我们可以通过理论知识来深入了解数值分析的方法和原理,但是,实践才是我们真正学习的方式。
在实践过程中,我们通过代码实现数值计算方法,进而对其进行深度理解。
因此,在学习数值分析过程中,我们不能只停留在理论层面,而应该加强实践环节,提高自己的计算机编程能力。
通过编写代码,我们可以更好地掌握数值计算方法,从而更加深入地理解数值分析的本质。
借鉴他人经验,及时沟通交流数值分析并不是一个孤立的学科,在实际应用中,它与其他科学和技术领域相互交织。
在学习数值分析的过程中,我们应该借鉴他人的经验,及时与同学和老师沟通交流。
借鉴他人的经验不仅可以帮助我们更快地掌握新的知识,还能够提高自己的思考和创造能力。
与同学和老师的交流则可以帮助我们更好地理解课程内容,同时,还可以促进团队合作和学术交流。
注重实际问题,深入开展应用研究数值分析不仅仅是一门学科,它更是一种解决实际问题的技术和方法。
因此,在学习数值分析的过程中,我们应该注重实际问题,根据实际需求深入开展应用研究。
通过深入研究实际问题,我们可以更好地发现问题的本质和规律,从而提出更优秀的数值计算方法和算法。
同时,我们还可以通过实际问题的研究,进一步提高自己的解决问题的能力和综合素质。
结语综上所述,学习数值分析需要我们不断积累经验,不断加强自己的理论基础和实践能力。
在学习过程中,我们应该注重理论与实践相结合,借鉴他人经验,加强交流与合作,注重实际问题,深入开展应用研究。
只有这样,我们才能真正掌握数值分析的精髓,提高自己的技术能力和综合素质。
数值分析算法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)高斯消元法是一种用于求解线性方程组的方法。
一、非线性方程求解二分法# include "math.h"# define f(x) sin(x)-x*x/2main(){ float a,b,c,e;int k=0;printf("\n\n\n 二分法求非线性方程的解"); Use Dichotomy solving nonlinear equations printf("\n\n f(x)已在源程序中定义!"); f (x) is defined in the sourceprintf("\n 已知f(x)在[a,b]上连续"); Known f (x) in [a, b] is continuousprintf("\n 请输入a:");scanf("%f",&a);printf(" 请输入b:");scanf("%f",&b);printf(" 请输入允许误差e:");scanf("%f",&e);loop:c=(a+b)/2;printf("\n\n a%d=%f",k,a);printf("\n b%d=%f",k,b);printf("\n x%d=%f",k,c);k++;if((f(a))*(f(c))>0) a=c;else b=c;if (b-a<=e){ printf("\n 最终结果是:");printf("\n x%d=%f",k,(a+b)/2);exit(0);}else goto loop;}运行结果:1.x18=1.4044132.x17=1.324717牛顿法# include "math.h"# define f(x) x*exp(x)-1# define f1(x) exp(x)+x*exp(x)main(){ float a, x0,x1,e1,e2;int N,k;printf("\n\n\n 用牛顿迭代法求非线性方程的解");printf("\n\n\n函数f(x)及f'(x)已在源程序中定义!");printf("\n\n 请输入初值x0:");scanf("%f",&x0);printf(" 输入误差e1:");scanf("%f",&e1);printf(" 输入误差e2:");scanf("%f",&e2);printf(" 输入最大迭代次数N:");scanf("%d",&N);k=1;loop:if(f(x0)==0) {printf("\n %f为所求得根之一!",x0);exit(0);}else if (fabs(f(x0))<e1) { printf("\n奇异标志!建议重取初值或取更小的e1,e2!"); exit(0);} else x1=x0-(f(x0))/(f1(x0));printf("\n 第%d次迭代:",k);printf("\n x%d=%f",k,x1);if (fabs(x1-x0)<e2) { printf("\n %f 为所求近似解!",x1);exit(0);}else if(k==N) { printf("\n迭代失败!建议取更大的N值或另选初值!"); exit(0); }else { x0=x1;k++;}goto loop ;}运行结果:1)xe x-1=0 x0=0.5x3=x4=0.5671432)x3-x-1=0 x0=1x4=x5=1.3247183)(x-1)2(2x-1)=0x0=0.45 x3=x4=0.500000x0=0.65 x8=0.5000004 x4=0.500000二、Gauss列主元消去法# define NUMBER 20# include "math.h"float A[NUMBER][NUMBER+1] ,ark;int flag,n;exchange(int r,int k){ int i;for(i=1;i<=n+1;i++)A[0][i]=A[r][i];for(i=1;i<=n+1;i++)A[r][i]=A[k][i];for(i=1;i<=n+1;i++)A[k][i]=A[0][i];}float max(int k){ int i;float temp=0;for(i=k;i<=n;i++)if(fabs(A[i][k])>temp){ temp=fabs(A[i][k]);flag=i;}return temp;}main(){ float x[NUMBER],b[NUMBER];int r,k,i,j;re: printf("\n\n\n 用Gauss列主元消元法解线性方程组");printf("\n input n=");scanf("%d",&n);printf("\n\n 现在输入系数矩阵A和向量b:\n\n");for(i=1;i<=n;i++)for(j=1;j<=n+1;j++){ if(j==n+1) printf(" 请输入b%d:",i);else printf(" 请输入a%d%d:",i,j);scanf("%f",&A[i][j]);}k=1;loop:ark=max(k);if(ark==0){ printf("\n不是合法的方程组!");exit(0);}else if(flag!=k)exchange(flag,k);for(i=k+1;i<=n;i++)for(j=k+1;j<=n+1;j++)A[i][j]=A[i][j]-A[i][k]*A[k][j]/A[k][k];if(k<n-1){ k++; goto loop;}else{ x[n]=A[n][n+1]/A[n][n];for( k=n-1;k>=1;k--){float me=0;for(j=k+1;j<=n;j++){ me=me+A[k][j]*x[j];}x[k]=(A[k][n+1]-me)/A[k][k];}}for(i=1;i<=n;i++)printf("\n x%d=%f",i,x[i]);goto re;}运行结果:1.x1= -0.491058x2= -0.050886x3= 0.3672572.x1=2.946429x2=0.607143x3=-0.142857若不选主元,则1的结果溢出,2不变,原因是1中a11太小,在消元过程中作了分母。
数值分析期末总结与体会数值分析是一门应用数学课程,主要研究数值计算方法和数值计算误差,并为实际问题提供数值计算解决方案。
在本学期的学习中,我深入学习了数值计算的基本概念与原理,并通过编程实践掌握了常见的数值计算方法。
在期末考试前夕,我对这门课的学习经历进行了总结与体会,下面是我对数值分析的期末总结与体会。
一、总结1. 知识掌握:在学习过程中,我通过系统的学习,掌握了课程中介绍的求根问题、插值问题、数值积分和数值微分等数值计算方法。
我了解了牛顿迭代法、二分法、割线法等求解非线性方程根的方法,熟悉了拉格朗日插值、牛顿插值等插值方法,学会了辛卜生插值多项式、三次样条插值等高级插值方法。
同时,我还学习了梯形法则、辛普森法则等数值积分算法,掌握了欧拉法、龙格-库塔法等数值微分算法。
2. 编程实践:在理论学习的基础上,我通过编写程序加深了对数值计算方法的理解与掌握。
我使用Python语言编写了求解非线性方程根、插值计算、数值积分和数值微分的代码,并通过实际运行验证了这些数值计算方法的正确性与有效性。
编程实践过程中,我深刻体会到了算法的重要性,不同的算法对于同一个数值计算问题,可能会有不同的效果。
3. 数值计算误差:在学习数值计算的过程中,我逐渐认识到数值计算误差的存在与产生机理。
由于计算机内部采用的是二进制表示法,而浮点数的二进制表示无法准确表示所有的实数,从而引入了舍入误差;另外,数值计算方法本身也存在精度误差,例如插值多项式的截断误差、数值积分的数值误差等。
掌握数值计算误差的产生原因和估计方法,对于正确评估数值计算结果的精度至关重要。
4. 应用实例:在学习过程中,我们还分析了各种实际问题,并通过数值计算方法得到了解决方案。
例如,在求根问题中,我们可以利用牛顿迭代法估计气体状态方程的参数;在插值问题中,我们可以使用拉格朗日插值方法恢复图像;在数值积分中,我们可以利用梯形法则或辛普森法则计算定积分;在数值微分中,我们可以应用欧拉法或者龙格-库塔法求解微分方程等。
数值分析总结范文数值分析是一门研究数值计算方法和数值计算误差的学科,它运用数学模型和计算机技术对实际问题进行数值计算和数值仿真。
数值分析在科学研究、工程设计和生产制造等领域中具有重要的应用价值。
本文将对数值分析的基本概念、方法和应用进行总结,并讨论其在实际问题中的重要性。
数值分析的基本概念包括离散化、数值逼近和数值解等。
离散化是将连续问题转化为离散问题,即将问题的自变量和函数值的取值范围划分为一系列离散的点,通过计算这些点上的数值来获得连续问题的近似解。
数值逼近是利用已知数据和适当的数学模型来构造近似函数,从而求出函数的近似值。
数值解是通过数值计算方法获得的问题的近似解,它往往是一个有限精度的数值。
数值分析的方法主要包括数值插值、数值积分、数值微分、求解线性方程组和求解非线性方程等。
数值插值是通过已知离散数据来构造一个连续函数的近似值,常用的插值方法有拉格朗日插值和牛顿插值等。
数值积分是用数值方法计算函数的积分值,常用的数值积分方法包括梯形法则、辛普森法则和龙贝格法则等。
数值微分是通过数值方法计算函数的导数值,常用的数值微分方法包括中心差分法和前向差分法等。
求解线性方程组是通过数值方法找到线性方程组的解,常用的求解方法有高斯消元法和LU分解法等。
求解非线性方程是通过数值方法找到非线性方程的近似解,常用的求解方法有二分法和牛顿法等。
数值分析在实际问题中具有广泛的应用。
在科学研究中,数值分析可以帮助科学家解决数学模型求解的问题,从而推动科学的发展。
例如,在物理学中,数值分析可以用来解决质点运动、电磁场分布和流体力学等问题。
在工程设计中,数值分析可以帮助工程师设计和优化产品的结构和性能。
例如,在航空工程中,数值分析可以用来模拟飞机的空气动力学性能,从而指导机翼和机身的设计。
在生产制造中,数值分析可以帮助生产者提高产品的质量和效率。
例如,在汽车制造中,数值分析可以用来模拟车辆的碰撞和疲劳性能,从而提高车辆的安全性和耐久性。
数值分析期末总结论文一、课程概述数值分析是计算数学的重要分支,主要研究数值计算方法和算法,并通过计算机实现,解决实际问题中数字计算的相关难题。
本学期的数值分析课程主要介绍了数值计算中的数值误差、插值与逼近、数值积分与数值微分以及常微分方程的数值解法等内容。
二、知识点总结1. 数值误差在计算过程中,由于计算机系统的有限位数表示和处理能力的限制,导致数值计算结果与精确解之间存在误差。
数值误差主要包括截断误差和舍入误差。
我们学习了数值计算中的绝对误差和相对误差,并介绍了浮点数表示法和浮点数运算的原理。
另外,对于一些特殊函数,如指数函数和三角函数,我们还学习了它们的数值计算方法。
2. 插值与逼近在实际问题中,往往需要根据已知数据点,通过插值或逼近方法得到未知点的近似值。
我们学习了插值多项式的构造方法,包括拉格朗日插值和牛顿插值。
在逼近方法中,我们学习了最小二乘逼近原理,介绍了线性最小二乘逼近和非线性最小二乘逼近的相关概念和方法。
3. 数值积分与数值微分数值积分是计算定积分的近似值的方法。
我们学习了数值积分的基本概念和方法,包括梯形法则、辛普森法则和高斯积分法。
与数值积分相对应的是数值微分,它是计算导数的近似值的方法。
我们学习了差商公式和微分方程初值问题的数值解法。
4. 常微分方程的数值解法常微分方程是自然科学和工程技术领域中常见的数学模型。
我们学习了常微分方程数值解法的基本思想和方法,包括欧拉法、改进欧拉法、四阶龙格-库塔法等。
三、学习收获1. 理论知识:通过本学期的学习,我对数值分析领域的基本概念和方法有了更深入的理解。
掌握了数值计算中的数值误差分析方法,为后续计算准确性估计提供了基础。
了解并熟悉了插值与逼近方法,为解决实际问题提供了有效途径。
学习了数值积分与数值微分的基本原理和计算方法,提高了数值计算的准确性和效率。
初步了解了常微分方程的数值解法,为解决实际科学问题提供帮助。
2. 实践能力:通过编程实践,我得到了锻炼和提高。
第一次数值分析编程报告Code 0:级数计算[HAMMING (1962)]Ψx=1k(k+x)∞k=1X取值x= 0.0,0.1,0.2,⋯,1.0,10.0,⋯,300.0共41个值,要求误差小于10−6,并给出相应的k值上界。
编程分析:我们知道上式中的级数收敛,在k取到足够大的时候,由于有上界的存在,级数变化就很小。
因此,我的想法是取一个很大的k(如30000000)用来计算级数的近似值。
然后从n=1开始计算1到n的有限和,当有限和与级数的近似值相差10^(-6)时,这时说明求和已经很好的逼近级数求和了,可以将该有限和近似替代级数值。
以下是用程序跑出的结果:Code 1:对函数F x=11+x2,x∈[−5,5]构造Lagrange插值多项式p(x),插值节点为:1.x i=5−10Ni,i=0,1,2,…,N2.x i=−5− cos(2i+12N+2Π),i=0,1,2,…,N并计算如下误差max i {f y i−p y i,y i=i−5,i=0,1, (100)对N=5,10,20,40比较以上两组节点的结果。
编程分析:因为拉格朗日型的插值多项式如下:P(x) = y i l i (x )n i=0其中l i x = x −x k x i − x k nk =1k≠i 由于在编程题目中已给出了节点和函数表达式,我们可以求出系数y i 和l i x 。
然后利用已求出的拉格朗日插值多项式求出最大误差。
算法:fx = 0.0for(i=0;i<=n;i++){tmp=1.0;for(j=0;j<i;j++)tmp = tmp*(x-x[j])/(x[i]-x[j]);for(j=i+1;j<=n;j++)tmp = tmp*(x-x[j])/(x[i]-x[j]);fx=fx+tmp*y[i];}以下是用程序跑出的结果:N=5Max error of gird (1): 0.4327Max error of gird (2):0.5559N=10Max error of gird (1):1.9156Max error of gird (2):0.1089N=20Max error of gird (1):58.2781Max error of gird (2):0.0153N=40Max error of gird (1):7.8689e+04Max error of gird (2):2.7386e-04分析:当n增大时,节点增多。
1. LU分解:[L U]=lu(A);2. 追赶法function x=zhuiganfa(A,b)[n,n]=size(A);for i=1:nif(i==1)l(i)=A(i,i);y(i)=b(i)/l(i);elsel(i)=A(i,i)-A(i,i-1)*u(i-1);y(i)=(b(i)-y(i-1)*A(i,i-1))/l(i);endif(i<n)u(i)=A(i,i+1)/l(i);end页脚内容1页脚内容2endx(n)=y(n)for j=n-1:-1:1x(j)=y(j)-u(j)*x(j+1);end数值试验:n=101;a= 12 1 0 01 12 1 00 1 12 1 00 0 1 12 1 011 12关键是如何定义上述矩阵:>>n=101;c1=ones(1,n-1);a1=diag(c1,-1); 这个-1说明行位置-1c2=12*ones(1,n);a2=diag(c2);c3=ones(1,n-1);a3=diag(c3,1);a=a1+a2+a3;3. 拉格朗日插值function yh=lage(x,y,xh)n=length(x);m=length(xh);yh=zeros(1,m);c1=ones(n-1,1);c2=ones(1,m);for i=1:nxp=x([1:i-1 i+1:n]);yh=yh+y(i)*prod((c1*xh-xp'*c2)./(x(i)-xp'*c2));页脚内容3endend>> x=[11,12];>> y=[2,4];>> xh=[11.75];>> lage(x,y,xh)ans =3.50004 最小二乘法1.最小二乘的xi和yi为:要拟合的函数为:y=a+bx-cxy 注意不是多项式2.编程函数为:function z = erchen(x,y)页脚内容4x1=ones(5,1);A=[x1,x,-x.*y]; 注意点乘z=A\y; 注意左除a=z(1);b=z(2);c=z(3);end输入:≻≻ x=[1953 1964 1982 1990 2000]';≻≻ y=[5.82 6.95 10.08 11.34 12.66]';≻≻ erchen(x,y)ans =2.9456 =a-0.0014 =b-0.0005 =c1.最小二乘的xi和yi为:页脚内容5要拟合的函数为:y=a+bx+cx2是多项式2.编程函数为:function z = erchen2(x,y)x1=ones(5,1);A=[x1,x,x.^2];z=A\y;a=z(1);b=z(2);c=z(3);end输入:≻≻ x=[0 0.25 0.5 0.75 1.00]';≻≻ y=[1.00 1.284 1.6487 2.1170 2.7183]';页脚内容6≻≻ erchen2(x,y)ans =1.00510.86420.8437最小二乘多项式拟合的简单函数方法:≻≻ x=[0 0.25 0.5 0.75 1.00]';≻≻ y=[1.00 1.284 1.6487 2.1170 2.7183]';≻≻ P=polyfit(x,y,2) 要拟合成4次,则2改成4就可以了P =0.8437 0.8642 1.0051 注意此内置函数输出的结果c,b,a是反的5 复合辛普森公式求解积分先定义函数:function v=f(x)v=sin(x); “若定义有除数要点除,分母有0时要特殊定义”页脚内容7end定义程序:function I=fsps(f,a,b,n)h=(b-a)/n;x=linspace(a,b,2*n+1);y=feval(f,x);I=(h/6)*(y(1)+2*sum(y(3:2:2*n-1))+4*sum(y(2:2:2*n))+y(2*n+1));end>> fsps('f ',0,1,4)ans =0.45976.不动点迭代思路不动点迭代常常有好几个迭代的不动点函数,所以要分别定义这些函数是很困难的,如是乎使用SWITCH内置函数进行切换,叫切换函数.1.先定义函数后进行编程的方法先需要定义不动点函数:页脚内容8function v=f(x)v=x^3-x-1;end再定义编程:function [it,x]=fixpnt1(f,a,maxit,tol)it=0;x=feval(f,a);while it<=maxit & abs(x-a)>tol,it=it+1;a=x;x=feval(f,a);end此函数的调用:>> fixpnt1('f',2,100,1e-5)ans =页脚内容913.利用切换函数SWITCH的方法(多个不动点迭代函数)function [x,it]=fixpnt(np,a,maxit,tol)switch np,case 1,phi=inline('(3*x+10)^(1/5)');case 2,phi=inline('sin(10*x)+2*cos(x)-3');case 3,phi=inline('3-atan(x)');case 4,phi=inline('-2-1/log(x^2+x+1)');endit=0;x=phi(a);while it<=maxit & abs(x-a)>tol,页脚内容10it=it+1;a=x;x=phi(a);end使用与输入:>> fixpnt(2,1,100,1e-5)ans =-4.26967. 雅可比迭代function [x it]=jacobi(A,b,tol)D=diag(diag(A));L=D-tril(A);U=D-triu(A);x=zeros(size(b));for it=1:500页脚内容11x=D\(b+L*x+U*x);error=norm(b-A*x)/norm(b);if (error<tol)break;endend8. 高斯迭代function [x it]=gaosi(A,b,tol)D=diag(diag(A));L=D-tril(A);U=D-triu(A);x=zeros(size(b));for it=1:500x=(D-L)\(b+U*x);error=norm(b-A*x)/norm(b);if (error<tol)页脚内容12break;endend9. SOR迭代function [x it]=SOR(A,b,w,tol)D=diag(diag(A));L=D-tril(A);U=D-triu(A);x=zeros(size(b));for it=1:500x=(D-w*L)\(w*b+(1-w)*D*x+w*U*x);error=norm(b-A*x)/norm(b);if (error<tol)break;endend页脚内容1310.二分法:1. 先要定义所求的函数:function v=f(x)v=x^3-x-1;end2. 二分法程序如下:function [x,it]=erfengfa(a,b,f,tol)fa=feval(f,a);fb=feval(f,b);it=0;while abs(b-a)>tol,it=it+1;x=a/2+b/2;fx=feval(f,x);if sign(fx)==sign(fa),a=x;fa=fx;页脚内容14elseb=x;fb=fx;endend11. 牛顿法:1.先定义函数后进行编程的方法先需要定义不动点函数需要计算的函数ffunction v = f( x )v=x^5-3*x-10;end需要计算的函数的导数gfunction v = g( x )v=5*x^4-3;end页脚内容152. 再定义编程:function v = newton(a,f,g,maxit,tol)it=0;x=a;while it<=maxit & abs(feval(f,x))>tol,it=it+1;x=x-feval(f,x)/feval(g,x);endv=[x,it];end12. 牛顿下山法:1.先定义函数后进行编程的方法先需要定义不动点函数需要计算的函数ffunction v = f(x)v=x^2+sin(10*x)-1页脚内容16end需要计算的函数的导数gfunction v =g(x)v = 2*x+10*cos(10*x)end2. 再定义编程1:function v = newtonxiashang(x0,f,g,maxit,tol)x=x0;it=0;while it<=maxit & abs(feval(f,x))>tol,it=it+1;d=-feval(f,x)/feval(g,x);lambda=1;isdone=0;while ~isdone,xn=x+lambda*d;页脚内容17if abs(feval(f,xn))<abs(feval(f,x)),isdone=1;else lambda=lambda*0.5;endendx=xn;endv=[x,it];end3. 再定义编程2:function v = newtonxiashang2(x0,f,g,maxit,tol)x=x0;it=0;while it<=maxit & abs(feval(f,x))>tol,it=it+1;d=-feval(f,x)/feval(g,x);页脚内容18lambda=1;while abs(feval(f,x+lambda*d))>=abs(feval(f,x)),lambda=0.5*lambda;endx=x+lambda*d;endv=[x,it];end13. 割线法1.先定义函数后进行编程的方法先需要定义函数需要计算的函数ffunction v = f( x )v=x^5-3*x-10;end页脚内容192. 再定义编程:function v = gexian(a,b,f,maxit,tol)it=0;x0=a;x=b;while it<=maxit & abs(feval(f,x))>tol,it=it+1;xt=x-feval(f,x)/(feval(f,x)-feval(f,x0))*(x-x0);x0=x;x=xt;endv=[x,it];end输入:>> gexian(1,2,'f',100,1e-5)ans =页脚内容201.7226 7.000014. 乘幂法function [t,y] = chenmifa( a,xinit,ep )v0=xinit;[tv ti]= max(abs(v0));lam0=v0(ti);u0=v0/lam0;flag=0;while (flag==0)v1=a*u0;[tv ti]= max(abs(v1));lam1=v1(ti);u0=v1/lam1;if (abs(lam0-lam1)<=ep)flag=1;end页脚内容21lam0=lam1;endt=lam1;y=u0;end运行及其结果:>> a=[2,3,2;10,3,4;3,6,1];>> xinit=[1 1 1]';>> ep=0.0001;>> [t y]=chenmifa(a,xinit,ep)t =11.0000y =0.50001.00000.7500页脚内容2215. 反幂法function [t y] =fanmifa( a,xinit,ep )v0=xinit;[tv ti]= max(abs(v0));lam0=v0(ti);u0=v0/lam0;flag=0;while (flag==0)v1=a^-1*u0;[tv ti]= max(abs(v1));lam1=v1(ti);u0=v1/lam1;if (abs(lam0^-1-lam1^-1)<=ep)flag=1;endlam0=lam1;页脚内容23endt=lam1^-1;y=u0;end运行提示:>> a=[12 6 -6;6 16 2;-6 2 16];>>xinit=[1 -0.5 0.5]';>> [t y] =fanmifa( a,xinit,0.0001 )t =4.4560y =1.0000-0.62870.628716. 结合原点平移反幂法页脚内容24function [t y] =yuandian( a,p,xinit,ep )[n n]=size(a);v0=xinit;[tv ti]= max(abs(v0));lam0=v0(ti);u0=v0/lam0;flag=0;while (flag==0)v1=(a-p*eye(n))^-1*u0;[tv ti]= max(abs(v1));lam1=v1(ti);u0=v1/lam1;if (abs(lam0^-1-lam1^-1)<=ep)flag=1;endlam0=lam1;end页脚内容25t=lam1^-1+p;y=u0;end运行结果:>> a=[6 2 1;2 3 1;1 1 1];>> p=6;>> ep=0.0001;>> xinit=[1 1 1]';>> [t y]=yuandian(a,p,xinit,ep)t =7.2880y =1.00000.52290.242217. 欧拉公式初值问题页脚内容261. 先定义导数函数f:function v = f( x,y)v=-y+x+1;end2. 定义欧拉公式编程:function [x,y] = oula( f,y0,a,b,n )y(1)=y0;h=(b-a)/n;x=a:h:b;for i=1:n;y(i+1)=y(i)+h*feval(f,x(i),y(i));endend18. 改进的欧拉公式初值问题1. 先定义导数函数f:function v = f( x,y)页脚内容27v=-y+x+1;end要先运行一下。
数值分析期末总结pdf一、引言数值分析指的是利用数值方法对数学问题进行计算和求解的一门学科,在科学计算和工程技术领域中具有重要的应用价值。
本学期学习了数值分析的基本理论知识和常用的数值计算方法,对于提高科学计算和工程分析的准确性和效率具有重要意义。
通过这门课程的学习,我深刻认识到数值分析在实际问题求解中的重要性,并且对于数值方法的原理和应用有了一定的了解。
下面将对本学期学习的内容进行总结和思考。
二、数值误差的分类在数值计算过程中,会产生各种不同类型的误差。
了解不同类型的误差对于评估计算结果的准确性十分重要。
常见的数值误差包括:绝对误差、相对误差、截断误差和舍入误差等。
绝对误差指的是数值计算结果与真实值之间的差距。
相对误差是绝对误差除以真实值,用来计算计算结果相对于真实值的相对准确性。
截断误差是指数值计算方法本身的误差,通常由数值逼近和离散化引起。
舍入误差是因计算机中浮点数的机器精度引起的误差,它是由于计算机在二进制下无法准确表示所有实数而引起的。
在数值计算中,为了减小舍入误差,可以采用舍入规则和舍入策略来控制舍入过程。
三、插值和拟合插值和拟合是数值分析中常用的数值逼近方法,它们可以通过已知数据点推断出未知数据点的数值。
插值是通过已知数据点构造一个函数,使得该函数在已知点上的取值与给定函数完全一致。
常见的插值方法包括拉格朗日插值和牛顿插值等。
拟合是通过已知数据点构造一个函数近似地表示给定函数,以最小化数据点和拟合函数之间的误差。
拟合方法包括最小二乘法和样条插值等。
在插值和拟合的过程中,需要根据实际问题选择适当的插值函数或拟合函数,并确定适当的插值节点或拟合参数。
选择不同的函数或节点参数可能会导致不同的逼近精度和计算效率。
因此,在实际问题中需要根据需求和计算资源的限制综合考虑。
四、数值微积分数值微积分是利用数值方法求解微积分问题的一门学科,常见的数值微积分问题包括数值积分和常微分方程数值解等。
数值积分是计算给定函数在给定区间上的定积分值。
数值分析实验报告总结随着电子计算机的普及与发展,科学计算已成为现代科学的重要组成部分,因而数值计算方法的内容也愈来愈广泛和丰富。
通过本学期的学习,主要掌握了一些数值方法的基本原理、具体算法,并通过编程在计算机上来实现这些算法。
算法算法是指由基本算术运算及运算顺序的规定构成的完整的解题步骤。
算法可以使用框图、算法语言、数学语言、自然语言来进行描述。
具有的特征:正确性、有穷性、适用范围广、运算工作量少、使用资源少、逻辑结构简单、便于实现、计算结果可靠。
误差计算机的计算结果通常是近似的,因此算法必有误差,并且应能估计误差。
误差是指近似值与真正值之差。
绝对误差是指近似值与真正值之差或差的绝对值;相对误差:是指近似值与真正值之比或比的绝对值。
误差来源见表表第三章泛函分析泛函分析概要泛函分析是研究“函数的函数”、函数空间和它们之间变换的一门较新的数学分支,隶属分析数学。
它以各种学科为具体背景,在集合的基础上,把客观世界中的研究对象抽象为元素和空间。
如:距离空间,赋范线性空间,内积空间。
范数范数,是具有“长度”概念的函数。
在线性代数、泛函分析及相关的数学领域,泛函是一个函数,其为矢量空间内的所有矢量赋予非零的正长度或大小。
这里以Cn空间为例,Rn空间类似。
最常用的范数就是p-范数。
那么当p取1,2,∞的时候分别是以下几种最简单的情形:1-范数:║x║1=│x1│+│x2│+?+│xn│2-范数:║x║2=1/2∞-范数:║x║∞=max其中2-范数就是通常意义下的距离。
对于这些范数有以下不等式:║x║∞≤║x║2 ≤║x║1 ≤ n1/2║x║2 ≤ n║x║∞另外,若p和q是赫德尔共轭指标,即1/p+1/q=1,那么有赫德尔不等式:|| = ||xH*y| ≤║x║p║y║q当p=q=2时就是柯西-许瓦兹不等式一般来讲矩阵范数除了正定性,齐次性和三角不等式之外,还规定其必须满足相容性:║XY║≤║X║║Y║。
1. LU分解:[LU]=lu(A);2.追赶法function x=zhuiganfa(A,b)[n,n]=size(A);for i=1:nif(i==1)l(i)=A(i,i);y(i)=b(i)/l(i);elsel(i)=A(i,i)-A(i,i-1)*u(i-1);y(i)=(b(i)-y(i-1)*A(i,i-1))/l(i);endif(i<n)u(i)=A(i,i+1)/l(i);endendx(n)=y(n)forj=n-1:-1:1x(j)=y(j)-u(j)*x(j+1);end数值试验:n=101;a= 1210 0112 1.........................................00112 1 ............................. 00 0 1 121 012关键是如何定义上述矩阵:>>n=101;c1=ones(1,n-1);a1=diag(c1,-1); 这个-1说明行位置-1c2=12*ones(1,n);a2=diag(c2);c3=ones(1,n-1);a3=diag(c3,1);a=a1+a2+a3;3.拉格朗日插值function yh=lage(x,y,xh)n=length(x);m=length(xh);yh=zeros(1,m);c1=ones(n-1,1);c2=ones(1,m);for i=1:nxp=x([1:i-1 i+1:n]);yh=yh+y(i)*prod((c1*xh-xp'*c2)./(x(i)-xp'*c2));endend>> x=[11,12];>>y=[2,4];>> xh=[11.75];>>lage(x,y,xh)ans =3.50004最小二乘法1.要拟合的函数为:y=a+bx-cxy 注意不是多项式2.编程函数为:function z =erchen(x,y)x1=ones(5,1);A=[x1,x,-x.*y];注意点乘z=A\y;注意左除a=z(1);b=z(2);c=z(3);end输入:≻≻ x=[1953 1964 1982 1990 2000]';≻≻y=[5.82 6.95 10.0811.3412.66]';≻≻ erchen(x,y)ans =2.9456 =a-0.0014=b-0.0005 =c1.要拟合的函数为:y=a+bx+cx是多项式2.编程函数为:functionz=erchen2(x,y)x1=ones(5,1);A=[x1,x,x.^2];z=A\y;a=z(1);b=z(2);c=z(3);end输入:≻≻ x=[0 0.250.5 0.751.00]';≻≻y=[1.00 1.284 1.6487 2.1170 2.7183]';≻≻ erchen2(x,y)ans =1.00510.86420.8437最小二乘多项式拟合的简单函数方法:≻≻ x=[00.25 0.50.75 1.00]';≻≻ y=[1.001.284 1.64872.11702.7183]';≻≻P=polyfit(x,y,2)要拟合成4次,则2改成4就可以了P =0.8437 0.8642 1.0051 注意此内置函数输出的结果c,b,a是反的5复合辛普森公式求解积分先定义函数:functionv=f(x)v=sin(x); “若定义有除数要点除,分母有0时要特殊定义”end定义程序:functionI=fsps(f,a,b,n)h=(b-a)/n;x=linspace(a,b,2*n+1);y=feval(f,x);I=(h/6)*(y(1)+2*sum(y(3:2:2*n-1))+4*sum(y(2:2:2*n))+y(2*n+1));end>>fsps('f',0,1,4)ans =0.45976.不动点迭代思路不动点迭代常常有好几个迭代的不动点函数,所以要分别定义这些函数是很困难的,如是乎使用SWITCH内置函数进行切换,叫切换函数.1.先定义函数后进行编程的方法先需要定义不动点函数:function v=f(x)v=x^3-x-1;end再定义编程:function[it,x]=fixpnt1(f,a,maxit,tol)it=0;x=feval(f,a);while it<=maxit&abs(x-a)>tol,it=it+1;a=x;x=feval(f,a);end此函数的调用:>> fixpnt1('f',2,100,1e-5)ans =13.利用切换函数SWITCH的方法(多个不动点迭代函数)function [x,it]=fixpnt(np,a,maxit,tol)switch np,case 1,phi=inline('(3*x+10)^(1/5)');case2,phi=inline('sin(10*x)+2*cos(x)-3');case3,phi=inline('3-atan(x)');case4,phi=inline('-2-1/log(x^2+x+1)'); endit=0;x=phi(a);whileit<=maxit& abs(x-a)>tol,it=it+1;a=x;x=phi(a);end使用与输入:>> fixpnt(2,1,100,1e-5)ans =-4.26967.雅可比迭代function[x it]=jacobi(A,b,tol)D=diag(diag(A));L=D-tril(A);U=D-triu(A);x=zeros(size(b));for it=1:500x=D\(b+L*x+U*x);error=norm(b-A*x)/norm(b);if (error<tol)break;endend8. 高斯迭代function [x it]=gaosi(A,b,tol)D=diag(diag(A));L=D-tril(A);U=D-triu(A);x=zeros(size(b));for it=1:500x=(D-L)\(b+U*x);error=norm(b-A*x)/norm(b);if (error<tol)break;endend9. SOR迭代function [x it]=SOR(A,b,w,tol)D=diag(diag(A));L=D-tril(A);U=D-triu(A);x=zeros(size(b));forit=1:500x=(D-w*L)\(w*b+(1-w)*D*x+w*U*x);error=norm(b-A*x)/norm(b);if(error<tol)break;endend10.二分法:1.先要定义所求的函数:function v=f(x)v=x^3-x-1;end2. 二分法程序如下:function[x,it]=erfengfa(a,b,f,tol)fa=feval(f,a);fb=feval(f,b);it=0;while abs(b-a)>tol,it=it+1;x=a/2+b/2;fx=feval(f,x);if sign(fx)==sign(fa),a=x;fa=fx;elseb=x;fb=fx;endend11. 牛顿法:1.先定义函数后进行编程的方法先需要定义不动点函数需要计算的函数ffunction v= f( x)v=x^5-3*x-10;end需要计算的函数的导数gfunctionv=g(x )v=5*x^4-3;end2.再定义编程:functionv= newton(a,f,g,maxit,tol)it=0;x=a;while it<=maxit& abs(feval(f,x))>tol, it=it+1;x=x-feval(f,x)/feval(g,x);endv=[x,it];end12.牛顿下山法:1.先定义函数后进行编程的方法先需要定义不动点函数需要计算的函数ffunctionv= f(x)v=x^2+sin(10*x)-1end需要计算的函数的导数gfunction v =g(x)v =2*x+10*cos(10*x)end2. 再定义编程1:function v=newtonxiashang(x0,f,g,maxit,tol)x=x0;it=0;whileit<=maxit &abs(feval(f,x))>tol,it=it+1;d=-feval(f,x)/feval(g,x);lambda=1;isdone=0;while ~isdone,xn=x+lambda*d;ifabs(feval(f,xn))<abs(feval(f,x)),isdone=1;elselambda=lambda*0.5;endendx=xn;endv=[x,it];end3.再定义编程2:functionv=newtonxiashang2(x0,f,g,maxit,tol)x=x0;it=0;while it<=maxit & abs(feval(f,x))>tol,it=it+1;d=-feval(f,x)/feval(g,x);lambda=1;while abs(feval(f,x+lambda*d))>=abs(feval(f,x)),lambda=0.5*lambda;endx=x+lambda*d;endv=[x,it];end13. 割线法1.先定义函数后进行编程的方法先需要定义函数需要计算的函数ffunction v = f( x)v=x^5-3*x-10;end2. 再定义编程:function v= gexian(a,b,f,maxit,tol)it=0;x0=a;x=b;while it<=maxit& abs(feval(f,x))>tol,it=it+1;xt=x-feval(f,x)/(feval(f,x)-feval(f,x0))*(x-x0);x0=x;x=xt;endv=[x,it];end输入:>>gexian(1,2,'f',100,1e-5)ans=1.7226 7.000014. 乘幂法function [t,y] =chenmifa( a,xinit,ep )v0=xinit;[tv ti]= max(abs(v0));lam0=v0(ti);u0=v0/lam0;flag=0;while (flag==0)v1=a*u0;[tvti]= max(abs(v1));lam1=v1(ti);u0=v1/lam1;if (abs(lam0-lam1)<=ep)flag=1;endlam0=lam1;endt=lam1;y=u0;end运行及其结果:>>a=[2,3,2;10,3,4;3,6,1];>> xinit=[1 11]';>> ep=0.0001;>> [t y]=chenmifa(a,xinit,ep)t=11.0000y =0.50001.00000.750015. 反幂法function[t y] =fanmifa( a,xinit,ep )v0=xinit;[tv ti]= max(abs(v0));lam0=v0(ti);u0=v0/lam0;flag=0;while (flag==0)v1=a^-1*u0;[tv ti]=max(abs(v1));lam1=v1(ti);u0=v1/lam1;if(abs(lam0^-1-lam1^-1)<=ep) flag=1;endlam0=lam1;endt=lam1^-1;y=u0;end运行提示:>> a=[12 6-6;6 162;-6216];>>xinit=[1 -0.5 0.5]';>>[t y]=fanmifa( a,xinit,0.0001 )t=4.4560y=1.0000-0.62870.628716. 结合原点平移反幂法function[t y]=yuandian( a,p,xinit,ep) [n n]=size(a);v0=xinit;[tv ti]=max(abs(v0));lam0=v0(ti);u0=v0/lam0;flag=0;while (flag==0)v1=(a-p*eye(n))^-1*u0;[tv ti]= max(abs(v1));lam1=v1(ti);u0=v1/lam1;if (abs(lam0^-1-lam1^-1)<=ep)flag=1;endlam0=lam1;endt=lam1^-1+p;y=u0;end运行结果:>>a=[621;2 31;1 11];>>p=6;>> ep=0.0001;>>xinit=[11 1]';>> [ty]=yuandian(a,p,xinit,ep)t=7.2880y =1.00000.52290.242217.欧拉公式初值问题1. 先定义导数函数f:function v = f( x,y)v=-y+x+1;end2.定义欧拉公式编程:function[x,y]=oula( f,y0,a,b,n)y(1)=y0;h=(b-a)/n;x=a:h:b;for i=1:n;y(i+1)=y(i)+h*feval(f,x(i),y(i));endend18. 改进的欧拉公式初值问题1. 先定义导数函数f:function v = f(x,y)v=-y+x+1;end要先运行一下。