计算方法与实习上机题答案

合集下载

计算方法试题及答案

计算方法试题及答案

计算方法试题及答案在计算方法的学习过程中,练习解答试题是非常重要的一部分。

下面,将提供一些计算方法试题及答案,以供学习和练习之用。

请按照正确的格式阅读和完成题目。

一、选择题1. 下列哪个选项是计算方法的基本思想?A. 运算过程B. 程序设计C. 算法和分析D. 数据采集答案:C. 算法和分析2. 当使用二分法求解函数 f(x) = x^2 - 4 = 0 的根时,若初始区间 [a,b] 为 [0, 5],则最终结果为:A. x = 2.0B. x = 2.2C. x = 2.4D. x = 2.5答案:C. x = 2.4二、填空题1. 约化消元法是一种求解方程组的方法,其基本思想是__________。

答案:逐行约化,得到简化方程组。

2. 在数值计算中,利用级数展开的方法求函数近似值的过程称之为__________。

答案:泰勒展开。

三、计算题1. 求解下列方程组的解:2x + y - z = 1x - y + 3z = 93x + 4y - 5z = -5答案:x = -2, y = 3, z = 42. 使用拉格朗日插值法,已知函数 f(x) 在点 x = 0, x = 1, x = 4 处的值分别为 1, 5, 7,求 f(2) 的近似值。

答案:f(2) 的近似值为 3.通过以上试题,希望能够帮助学习者巩固和加深对计算方法的理解,并提供一定的练习机会。

在学习过程中,建议理解每道题目的解题思路和方法,灵活运用所学知识,加强实际问题的应用。

希望大家能够通过不断的练习和学习提升计算方法的能力。

excel上机考试题及答案

excel上机考试题及答案

excel上机考试题及答案Excel上机考试题及答案一、单项选择题(每题2分,共10分)1. 在Excel中,以下哪个函数用于计算一组数值的平均值?A. SUMB. AVERAGEC. COUNTD. MAX答案:B2. 如果你想要在Excel中查找一个数值在某个范围内的相对位置,应该使用哪个函数?A. VLOOKUPB. HLOOKUPC. MATCHD. INDEX答案:C3. 在Excel中,哪个快捷键可以快速填充公式到相邻的单元格?A. Ctrl + CB. Ctrl + VC. Ctrl + DD. Ctrl + R答案:C4. Excel中,以下哪个函数用于计算一组数值的标准差?A. VARB. STDEVC. VARPD. STDEVP答案:B5. 在Excel中,如何将一列数据转换为行数据?A. 使用“复制”和“粘贴特殊”功能B. 使用“转置”功能C. 使用“排序”功能D. 使用“筛选”功能答案:B二、多项选择题(每题3分,共15分)6. 在Excel中,以下哪些操作可以对数据进行排序?A. 使用“数据”选项卡中的“排序”功能B. 使用快捷键Ctrl + Shift + SC. 使用“筛选”功能D. 使用“查找和选择”功能答案:A7. Excel中,哪些工具可以帮助用户进行数据分析?A. 数据透视表B. 条件格式C. 图表D. 宏答案:A, B, C8. 在Excel中,以下哪些函数用于查找和引用数据?A. VLOOKUPB. INDEXC. MATCHD. CONCATENATE答案:A, B, C9. Excel中,以下哪些功能可以帮助用户进行数据验证?A. 数据验证B. 条件格式C. 错误检查D. 公式审核答案:A10. 在Excel中,以下哪些图表类型可以用来展示数据的趋势?A. 折线图B. 柱状图C. 饼图D. 散点图答案:A, B, D三、填空题(每题2分,共20分)11. 在Excel中,使用________函数可以计算一组数值的最大值。

计算方法上机作业

计算方法上机作业

计算方法上机陈说之阿布丰王创作姓名:学号:班级:上课班级:说明:本次上机实验使用的编程语言是Matlab语言,编译环境为MATLAB 7.11.0,运行平台为Windows 7.1.对以下和式计算:,要求:①若只需保管11个有效数字,该如何进行计算;②若要保管30个有效数字,则又将如何进行计算;(1)算法思想1、根据精度要求估计所加的项数,可以使用后验误差估计,通项为:2、为了保证计算结果的准确性,写法式时,从后向前计算;3、使用Matlab时,可以使用以下函数控制位数:digits(位数)或vpa(变量,精度为数)(2)算法结构2.end;3.(3)Matlab源法式clear; %清除工作空间变量clc; %清除命令窗口命令m=input('请输入有效数字的位数m='); %输入有效数字的位数s=0;for n=0:50t=(1/16^n)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6));if t<=10^(-m) %判断通项与精度的关系break;endend;fprintf('需要将n值加到n=%d\n',n-1); %需要将n值加到的数值for i=n-1:-1:0t=(1/16^i)*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6));s=s+t; %求和运算ends=vpa(s,m) %控制s的精度(4)结果与分析当保管11位有效数字时,需要将n值加到n=7,s =3.1415926536;当保管30位有效数字时,需要将n值加到n=22,s =3.14159265358979323846264338328.通过上面的实验结果可以看出,通过从后往前计算,这种算法很好的保证了计算结果要求保管的准确数字位数的要求.2.某通信公司在一次施工中,需要在水面宽度为20米的河沟底部沿直线走向铺设一条沟底光缆.在铺设光缆之前需要对沟底的地形进行初步探测,从而估计所需光缆的长度,为工程预算提供依据.已探测到一组等分点位置的深度数据(单元:米)如下表所示:①②预测所需光缆长度的近似值,作出铺设河底光缆的曲线图;(1)算法思想如果使用多项式差值,则由于龙格现象,误差较年夜,因此,用相对较少的插值数据点作插值,可以防止年夜的误差,可是如果又希望将所得数据点都用上,且所用数据点越多越好,可以采纳分段插值方式,即用分段多项式取代单个多项式作插值.分段多项式是由一些在相互连接的区间上的分歧多项式连接而成的一条连续曲线,其中三次样条插值方法是一种具有较好“光滑性”的分段插值方法.在本题中,假设所铺设的光缆足够柔软,在铺设过程中光缆触地走势光滑,紧贴空中,而且忽略水流对光缆的冲击.海底光缆线的长度预测模型如下所示,光缆从A 点铺至B 点,在某点处的深度为i h .海底光缆线的长度预测模型计算光缆长度时,用如下公式:20()L f x ds=⎰20'20()1()f x f x dx =+⎰191'20()1()k kk f x f x dx+==+∑⎰22()()x y =∆+∆∑(2)算法结构1.For n i ,,2,1,0⋅⋅⋅= 1.1 ii M y ⇒2.For 2,1=k2.1 For k n n i ,,1, -=3.4.6.7. 获取M的矩阵元素个数,存入m8.9.10.11. 获取x的元素个数存入s12.13.break14.(3)Matlab源法式clear;clc;x=0:1:20; %发生从0到20含21个等分点的数组X=0:0.2:20;y=[9.01,8.96,7.96,7.97,8.02,9.05,10.13,11.18,12.26,13.28,13.32,12.61,11.29,10.22,9.1 5,7.90,7.95,8.86,9.81,10.80,10.93]; %等分点位置的深度数据n=length(x); %等分点的数目N=length(X);%% 求三次样条插值函数s(x)M=y;for k=2:3; %计算二阶差商并寄存在M中for i=n:-1:k;M(i)=(M(i)-M(i-1))/(x(i)-x(i-k+1));endendh(1)=x(2)-x(1); %计算三对角阵系数a,b,c及右端向量dfor i=2:n-1;h(i)=x(i+1)-x(i);c(i)=h(i)/(h(i)+h(i-1));a(i)=1-c(i);b(i)=2;d(i)=6*M(i+1);endM(1)=0; %选择自然鸿沟条件M(n)=0;b(1)=2;b(n)=2;c(1)=0;a(n)=0;d(1)=0;d(n)=0;u(1)=b(1); %对三对角阵进行LU分解y1(1)=d(1);for k=2:n;l(k)=a(k)/u(k-1);u(k)=b(k)-l(k)*c(k-1);y1(k)=d(k)-l(k)*y1(k-1);endM(n)=y1(n)/u(n);%追赶法求解样条参数M(i)for k=n-1:-1:1;M(k)=(y1(k)-c(k)*M(k+1))/u(k);ends=zeros(1,N);for m=1:N;k=1;for i=2:n-1if X(m)<=x(i);k=i-1;break;elsek=i;endendH=x(k+1)-x(k); %在各区间用三次样条插值函数计算X点处的值 x1=x(k+1)-X(m);x2=X(m)-x(k); s(m)=(M(k)*(x1^3)/6+M(k+1)*(x2^3)/6+(y(k)-(M(k)*(H^2)/6))*x1+(y(k+1)-(M(k+1)*(H^2)/6))*x2)/H;end%% 计算所需光缆长度L=0; %计算所需光缆长度for i=2:NL=L+sqrt((X(i)-X(i-1))^2+(s(i)-s(i-1))^2);enddisp('所需光缆长度为 L=');disp(L);figureplot(x,y,'*',X,s,'-') %绘制铺设河底光缆的曲线图xlabel('位置','fontsize',16); %标注坐标轴含义ylabel('深度/m','fontsize',16);title('铺设河底光缆的曲线图','fontsize',16);grid;(4)结果与分析铺设海底光缆的曲线图如下图所示:仿真结果标明,运用分段三次样条插值所得的拟合曲线能较准确地反映铺设光缆的走势图,计算出所需光缆的长度为 L=26.4844m.3.假定某天的气温变动记录如下表所示,试用数据拟合的方法找出这一天的气温变动的规律;试计算这一天的平均气温,并试估计误差.时刻123456789 10 11 12平均气温 15 14 14 14 14 15 16 18 20 20 23 25 28 时刻13 14 15 16 17 18 19 20 21 22 23 24平均气温 31 34 31 29 27 25 24 22 20 18 17 16(1在本题中,数据点的数目较多.当数据点的数目很多时,用“多项式插值”方法做数据近似要用较高次的多项式,这不单给计算带来困难,更主要的缺点是误差很年夜.用“插值样条函数”做数据近似,虽然有很好的数值性质,且计算量也不年夜,但寄存参数Mi 的量很年夜,且没有一个统一的数学公式来暗示,也带来了一些方便.另一方面,在有的实际问题中,用插值方法其实分歧适.当数据点的数目很年夜时,要求)(x p 通过所有数据点,可能会失去原数据所暗示的规律.如果数据点是由丈量而来的,肯定带有误差,插值法要求准确通过这些禁绝确的数据点是分歧适的.在这种情况下,不用插值标准而用其他近似标准更加合理.通常情况下,是选取i 使2E 最小,这就是最小二乘近似问题.在本题中,采纳“最小二乘法”找出这一天的气温变动的规律,使用二次函计算相应的系数,估算误差,并作图比力各种函数之间的区别.(2)算法结构本算法用正交化方法求数据的最小二乘近似..I 、使用二次函数、三次函数、四次函数拟合时1.2.则拟合多项式函数为3.1 [3.2 [4. [5. [II、使用指数函数拟合时现将指数函数进行变形:对上式左右取对数得则可很多项式(3)Matlab源法式clear; %清除工作空间变量clc; %清除命令窗口命令x=0:24; %将时刻值存入数组y=[15,14,14,14,14,15,16,18,20,20,23,25,28,31,34,31,29,27,25,24,22,20,18,17,16]; [~,m]=size(x); %将数据点的个数存入mT=sum(y(1:m))/m;fprintf('一天的平均气温为T=%f\n',T); %求一天的平均气温%% 二次、三次、四次函数的最小二乘近似h=input('请输入拟合多项式的最高项次数='); %根据给定命据点生成矩阵Gn=h+1;for j=0:(n-1)g=x.^j; %g(x)按列排列G=vertcat(G,g); %g垂直连接GendG=G'; %转置获得矩阵Gfor i=1:m %将数据y作为G的最后一列(n+1列)G(i,n+1)=y(i);endG;for k=1:n %形成矩阵Q(k)if G(k,k)>0;sgn=1;elseif G(k,k)==0;sgn=0;else sgn=-1;endsgm=-sgn*sqrt(sum(G(k:m,k).^2));w=zeros(1,n);w(k)=G(k,k)-sgm;for j=k+1:mw(j)=G(j,k);endbt=sgm*w(k);G(k,k)=sgm; %变换Gk-1到Gkfor j=k+1:n+1t=sum(w(k:m)*G(k:m,j))/bt;for i=k:m;G(i,j)=G(i,j)+t*w(i);endendendA (n)=G(n,n+1)/G(n,n); %解三角方程求系数A for i=n-1:-1:1A (i)=(G(i,n+1)-sum(G(i,i+1:n).*A (i+1:n)))/G(i,i);ende=sum(G(n+1:m,n+1).^2); %计算误差e fprintf('%d次函数的系数是:',h); %输出系数a及误差efprintf('使用%d次函数拟合的误差是%f:',h,e);t=0:0.05:24;A=fliplr(A); %将系数数组左右翻转Y=poly2sym(A); %将系数数组转化为多项式subs(Y,'x',t);Y=double(ans);figure(1)plot(x,y,'k*',t,Y,'r-'); %绘制拟合多项式函数图形xlabel('时刻'); %标注坐标轴含义ylabel('平均气温');title([num2str(n-1),'次函数的最小二乘曲线']);grid;%% 指数函数的最小二乘近似yy=log(y);n=3;G=[];GG=[];for j=0:(n-1)g=x.^j; %g(x)按列排列G=vertcat(G,g); %g垂直连接Ggg=t.^j; %g(x)按列排列GG=vertcat(GG,gg); %g垂直连接GendG=G'; %转置获得矩阵Gfor i=1:m %将数据y作为G的最后一列(n+1列)G(i,n+1)=yy(i);endG;for k=1:n %形成矩阵Q(k)if G(k,k)>0;sgn=1;elseif G(k,k)==0;sgn=0;else sgn=-1;endsgm=-sgn*sqrt(sum(G(k:m,k).^2));w=zeros(1,n);w(k)=G(k,k)-sgm;for j=k+1:mw(j)=G(j,k);endbt=sgm*w(k);G(k,k)=sgm; %变换Gk-1到Gkfor j=k+1:n+1t=sum(w(k:m)*G(k:m,j))/bt;for i=k:m;G(i,j)=G(i,j)+t*w(i);endendendA(n)=G(n,n+1)/G(n,n); %解三角方程求系数Afor i=n-1:-1:1A (i)=(G(i,n+1)-sum(G(i,i+1:n).*A (i+1:n)))/G(i,i);endb=-A(3);c=A(2)/(2*b);a=exp(A(1)+b*(c^2));G(n+1:m,n+1)=exp(sum(G(n+1:m,n+1).^2));e=sum(G(n+1:m,n+1).^2); %计算误差efprintf('\n指数函数的系数是:a=%f,b=%f,c=%f',a,b,c);%输出系数及误差e fprintf('\n使用指数函数拟合的误差是:%f',e);t=0:0.05:24;YY=a.*exp(-b.*(t-c).^2);figure(2)plot(x,y,'k*',t,YY,'r-'); %绘制拟合指数函数图形xlabel('时刻'); %标注坐标轴含义ylabel('平均气温');title(['指数函数的最小二乘曲线']);grid;(4)结果与分析a、二次函数:一天的平均气温为: 21.20002次函数的系数: 8.3063 2.6064 -0.0938使用2次函数拟合的误差是:280.339547二次函数的最小二乘曲线如下图所示:b、三次函数:一天的平均气温为: 21.20003次函数的系数: 13.3880 -0.2273 0.2075 -0.0084 使用3次函数拟合的误差是: 131.061822三次函数的最小二乘曲线如下图所示:c、四次函数:一天的平均气温为: 21.20004次函数的系数: 16.7939 -3.7050 0.8909 -0.0532 0.0009 使用4次函数拟合的误差是:59.04118四次函数的最小二乘曲线如下图所示:d、指数函数:一天的平均气温为: 21.2000指数函数的系数是:a=26.160286,b=0.004442,c=14.081900使用指数函数拟合的误差是:57.034644指数函数的最小二乘曲线如下图所示:通过上述几种拟合可以发现,多项式的次数越高,计算拟合的效果越好,误差越小,说明结果越准确;同时,指数多项式拟合的次数虽然不高,但误差最小,说明结果最准确.4.设计算法,求出非线性方程52645200x x -+=的所有根,并使误差不超越410-.(1)算法思想首先,研究函数的形态,确定根的范围;通过剖分区间的方法确定根的位置,然后利用二分法的基来源根基理进行求解,找到满足精度要求的解.二分法是发生一串区间,使新区间)1(+k I 是旧区间)(k I 的一个子区间,其长度)(k I 的一半,且有一个端点是)(k I 的一个端点.由区间],[)1()()(+=k k k x x I 确定区间)1(+k I 的方法是计算区间)(k I 的中点 )(21)1()()2(+++=k k k x x x若0)()()2()(<+k k x f x f ,则取],[)2()()1(++=k k k x x I ,否则取],[)1()2()1(+++=k k k x x I ,重复这一过程即可.显然,每次迭代使区间长度减小一半,故二分法总是收敛的.(2)算法结构stopstopstopelse10.go to 5(3)Matlab源法式x=-100:100;y=6*(x.^5)-45*(x.^2)+20; %非线性方程组的表达式g=[];for i=-100:1:100 %确定根所在的区间k=i+1;if(y(x==i).*y(x==k)<eps) %区间长度为1g=[g i];endendsyms x;f=6*x^5-45*x^2+20;n=length(g); %确定根的个数for j=1:nx0=g(j); %求根区间左端点x1=g(j)+1; %求根区间右端点while (x1-x0)>=10^(-4)if subs(f,x,x0)*subs(f,x,(x0+x1)/2)>epsx0=(x0+x1)/2;elsex1=(x0+x1)/2;endendroot=x0 %输出方程的根end(4)结果与分析该非线性方程组有三个实根,分别为1.8708,0.6812,-0.6545,且满足误差要求.5.编写法式实现年夜规模方程组的列主元高斯消去法法式,并对所附的方程组进行求解.针对本专业中所碰到的实际问题,提炼一个使用方程组进行求解的例子,并对求解过程进行分析、求解.(1)算法思想高斯消去法是利用现行方程组初等变换中的一种变换,即用一个不为零的数乘一个方程后加只另一个方程,使方程组酿成同解的上三角方程组,然后再自下而上对上三角方程组求解.,元素中选出绝对值最年夜的,.交换系数矩阵中的两行(包括常数项),只相当于两个方程的位置交换了,因此,列选主元不影响求解的结果.法式的核心就是高斯列主元消去法.根据教材提供的算法,编写列主元消去法的子函数与适应于超年夜规模超越系统内存的方程组的改编法式.同时,在Gauss消去过程中,适当交换方程的顺序对保证消去过程能顺利进行及计算解的精确度都是有需要的,,绝对值最年夜的一个换到(k,k)位置而成为第k步消去的主元,这就是列主元Gauss消去法.(2)算法结构1、数据文件的文件名为:文件名+.dat2、数据文件中的数据为二进制记录结构,分为以下四个部份:(1)文件头部份,其结构:typedef struct{long int id;long int ver;long int n;}其中:id:为该数据文件的标识,值为0xF1E1D1A0,即为:十六进制的F1E1D1A0ver:为数据文件的版本号,值为16进制数据,n:(2)文件头2:此部份说明为条状矩阵的上下带宽,结构:typedef struct{long int q; // 为上带宽long int p; // 为下带宽}(3)系数矩阵a.如存贮格式非为压缩方式,则按行方式存贮系数矩阵中的每一个元素,个数为n*n,类型为float型;b.如果存贮格式是压缩方式,则按行方式存贮,每行中只寄存上下带宽内的非零元素,即,每行中存贮的最多元素为p+q+1个.(4)右端系数按顺序存贮右端系数的每个元素,个数为n个,类型为float型3、二进制文件的读取:f=fopen('fun003.dat','r'); %翻开文件,.dat文件放在 m 文件同一目录下,a=fread(f,3,'uint') %读取头文件,3-读取前 3 个,若读取压缩格式的,头文件为 5 个b=fread(f,inf,'float'); %读取剩下的文件,float 型id=dec2hex(a(1));ver=dec2hex(a(2)); %这两句是进行进制转换,读取 id 与ver1. A2.1(3)Matlab源法式clear; %清除工作空间变量clc; %清除命令窗口命令%% 读取系数矩阵[f,p]=uigetfile('*.dat','选择数据文件'); %读取数据文件num=5; %输入系数矩阵文件头的个数name=strcat(p,f);file=fopen(name,'r');head=fread(file,num,'uint'); %读取二进制头文件id=dec2hex(head(1)); %读取标识符fprintf('文件标识符为');idver=dec2hex(head(2)); %读取版本号fprintf('文件版本号为');vern=head(3); %读取阶数fprintf('矩阵A的阶数');nq=head(4); %上带宽fprintf('矩阵A的上带宽');qp=head(5); %下带宽fprintf('矩阵A的下带宽');pdist=4*num;fseek(file,dist,'bof'); %把句柄值转向第六个元素开头处[A,count]=fread(file,inf,'float'); %读取二进制文件,获取系数矩阵fclose(file); %关闭二进制头文件%% 对非压缩带状矩阵进行求解if ver=='102',a=zeros(n,n);for i=1:n,for j=1:n,a(i,j)=A((i-1)*n+j); %求系数矩阵a(i,j)endendb=zeros(n,1);for i=1:n,b(i)=A(n*n+i);endfor k=1:n-1, %列主元高斯消去法m=k;for i=k+1:n, %寻找主元if abs(a(m,k))<abs(a(i,k))m=i;endendif a(m,k)==0 %遇到条件终止disp('毛病!')returnendfor j=1:n, %交换元素位置得主元t=a(k,j);a(k,j)=a(m,j);a(m,j)=t;t=b(k);b(k)=b(m);b(m)=t;endfor i=k+1:n, %计算l(i,k)并将其放到a(i,k)中 a(i,k)=a(i,k)/a(k,k);for j=k+1:na(i,j)=a(i,j)-a(i,k)*a(k,j);end。

计算方法考试题及其答案

计算方法考试题及其答案

计算方法考试题及其答案题目一:1. 计算以下方程的实根个数:3x^2 - 5x + 2 = 0解答一:首先,我们需要判断方程的判别式是否大于0。

判别式 D = b^2 - 4ac,其中 a、b、c 分别为方程中各项的系数。

对于方程 3x^2 - 5x + 2 = 0,a = 3,b = -5,c = 2。

将这些值代入判别式公式得到 D = (-5)^2 - 4 * 3 * 2 = 25 - 24 = 1。

由于判别式大于0,根据二次方程解的性质可知,该方程有两个不相等的实根。

题目二:2. 求下列函数的导数:f(x) = sin(2x) + 3x^2 - 2x解答二:对于这个函数,我们需要分别求出各项的导数,然后将其相加。

f'(x) = (sin(2x))' + (3x^2)' - (2x)'对于第一项,根据链式求导法则,其导数为 cos(2x) * (2x)' =2cos(2x)。

对于第二项,使用幂函数求导法则,其导数为 3 * 2x^(2-1) = 6x。

对于第三项,一次项的导数为常数系数,即 -2。

将上述导数相加,得到 f'(x) = 2cos(2x) + 6x - 2。

题目三:3. 某公司年利润为 100 万元,假设每年增长 10%,那么经过 n 年后公司的利润是多少?解答三:假设 n 年后公司的利润为 P(万元)。

根据题意可知,公司每年的利润增长率为 10%,也即每年的利润增加量为当前利润的 10%。

因此,我们可以得到以下关系式:P = 100 + 0.1 * 100 + 0.1^2 * 100 + ... + 0.1^n * 100这是一个等比数列求和的问题,我们可以使用等比数列求和公式来解决:P = 100 * [(1 - 0.1^(n+1)) / (1 - 0.1)]简化上述公式后可得 P = 1000 * (1 - 0.1^(n+1)) / (1 - 0.1)。

(完整word版)计算方法上机题目

(完整word版)计算方法上机题目

目录1.计算方法A 上机作业 (1)上机练习目的 (1)上机练习任务 (1)计算方法A 上机题目 (1)程序设计要求 (1)上机报告要求 (1)2.QR 分解法求解线性方程组 (2)计算原理 (2)程序框图 (7)计算实习 (8)Matlab代码 (8)3.共轭梯度法求解线性方程组 (10)计算原理 (10)程序框图 (11)计算实习 (12)Matlab代码 (12)4.三次样条插值 (14)计算原理 (14)程序框图 (16)计算实习 (17)Matlab代码 (17)5.四阶龙格-库塔法求解常微分方程的初值问题 (21)计算原理 (21)程序框图 (22)计算实习 (23)Matlab代码 (23)1.计算方法A 上机作业上机练习目的❑ 复习和巩固数值计算方法的基本数学模型,全面掌握运用计算机进行数值计算的具体过程及相关问题。

❑ 利用计算机语言独立编写、调试数值计算方法程序,培养学生利用计算机和所学理论知识分析解决实际问题的能力。

上机练习任务•利用计算机语言编写并调试一系列数值方法计算通用程序,并能正确计算给定题目,掌握调试技能。

•掌握文件使用编程技能,如文件的各类操作,数据格式设计、通用程序运行过程中文件输入输出运行方式设计等。

•写出上机练习报告。

计算方法A 上机题目1. QR 分解方法求解线性方程组。

(第二章)2. 共轭梯度法求解线性方程组。

(第三章)3. 三次样条插值(第四章)4. 四阶龙格-库塔法求解常微分方程的初值问题程序设计要求1. 程序要求是通用的,在程序设计时要充分考虑哪些变量应该可变的。

2. 程序要求调试通过。

上机报告要求报告内容包括:● 每种方法的算法原理及程序框图。

● 程序使用说明。

● 算例计算结果。

2. QR 分解法求解线性方程组计算原理当n x R ∈是任意给定的非零向量,n v R ∈是任意给定的单位向量,则存在初等反射阵2T H I uu =-,使得Hx v σ=,其中σ为常数,当取单位向量2x vu x v σσ-=-P P 时,由u 确定的矩阵H 必定满足Hx v σ=,所以在计算过程中取u 的值为上述值。

计算方法练习题与答案

计算方法练习题与答案
练习题与答案
练习题一
练习题二
练习题三
练习题四
练习题五
练习题六
练习题七
练习题八
练习题答案
练习题
、是非题
1.x*–12.0326作为x的近似值一定具有6位有效数字,且其误差限
1210
2.对两个不同数的近似数,误差越小,有效数位越多
3.一个近似数的有效数位愈多,其相对误差限愈小。
2
1x
3.14和3.142作为 的近似值有效数字位数相同
四*、证明题
已知方程f (x)0,试导出求根公式
xk 1xk2[f (xk)]2f (xk) f (xk)
并证明:当x是方程f(x)0的单根时,公式是3阶收敛的。
3.高斯—塞德尔迭代法一定比雅可比迭代法收敛快。
(k 1) (k)
4.||M|| 1是迭代格式x(k1)Mx(k)f收敛的必要条件5*.逐次超松弛迭代法是高斯—赛德尔迭代法的一种加速方法。
方法。
三、选择题
1.解方程组Ax b的迭代格式x(k 1)Mx(k)f收敛的充要条件是( )(A)||A|| 1;(B)||M|| 1;
(C)(A)1;(D)(M )1。
2.幂法的收敛速度与特征值的分布()
(A)有关;(B)无关;(C)不一定。
3.幂法是用来求矩阵( )特征值及特征向量的迭代法。
(A)按模最大;(B)按模最小;
(A).舍入(B).观测(C).模型(D).截断
5.1.41300作为2的近似值,有()位有效数字。
(A)3;(B)4;(C)5;(D)6。
四、计算题
1.3.142,3.141,7分别作为 的近似值,各有几位有效数字?
2. 设计算球体积允许的相对误差限为1%,问测量球直径的相对误差限最大为 多少?

计算方法课后习题答案

计算方法课后习题答案在计算方法课程中,学生通常会接触到各种数学问题的求解方法,包括但不限于数值分析、线性代数、微分方程等。

以下是一些课后习题的解答示例:习题一:求解线性方程组设线性方程组为:\[ \begin{align*}a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n &= b_1, \\a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n &= b_2, \\\vdots \quad \quad & \ \vdots \\a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n &= b_m,\end{align*} \]解答:使用高斯消元法或矩阵分解法求解上述方程组。

首先将系数矩阵转换为行简化阶梯形式,然后回代求解未知数 \( x_1, x_2,\ldots, x_n \)。

习题二:数值积分给定函数 \( f(x) \),需要在区间 \( [a, b] \) 上进行数值积分。

解答:可以使用梯形法、辛普森法等数值积分方法。

例如,使用梯形法的公式为:\[ \int_a^b f(x)dx \approx \frac{h}{2} \left( f(a) + 2f(a+h) + 2f(a+2h) + \cdots + 2f(b-h) + f(b) \right), \]其中 \( h = \frac{b-a}{n} \) 是区间的等分宽度,\( n \) 是等分数。

习题三:常微分方程的数值解给定一个常微分方程 \( y' = f(x, y) \),初始条件为 \( y(x_0) = y_0 \)。

解答:使用欧拉法或龙格-库塔法求解。

以欧拉法为例,其迭代公式为:\[ y_{n+1} = y_n + h f(x_n, y_n), \]其中 \( h \) 是步长,\( x_{n+1} = x_n + h \)。

数值计算方法上机实验题

数值计算方法上机实验实验内容:1.要求:分别用复化梯形法,复化Simpson 法和 Romberg 公式计算.2.给定积分dx e x⎰31和dx x ⎰311 ,分别用下列方法计算积分值要求准确到510- ,并比较分析计算时间. 1)变步长梯形法; 2)变步长 Simpson 法; 3) Romberg 方法.算法描述:1、复合梯形法:⎰=tdt t a t V 0)()( ))()(2)((211∑-=++=n k k n b f x f a f hT输入 被积函数数据点t,a. 输出 积分值.n T复合Simpson 法:⎰=tdt t a t V 0)()( ))()(2)(4)((6101121∑∑---=++++=n k n k k k n b f x f x f a f hS输入 被积函数f(x),积分区间[a,b]和n 输出 复合Simpson 积分值n S步1 .);()(;a x b f a f S nab h n ⇐-⇐-⇐ 步2 对n k ,,2,1 =执行).(2;2);(4;2x f S S hx x x f S S h x x n n n n +⇐+⇐+⇐+⇐步3 n n S hS ⨯⇐6步4 输出n SRomberg 积分法:根据已知数据对其进行多项式拟合得出p(x);f(x)⇐p(x); 输入 被积函数f(x),积分区间端点a,b,允许误差ε 输出 Romberg 积分值n R 2 步1 .0;0;0;0));()((2;1111⇐===+⇐-⇐k R C S b f a f hT a b h 步2 反复执行步3→步9. 步3 .2;0h a x S +⇐⇐ 步4 反复执行步5→步6. 步5 ;);(h x x x f S S +⇐+⇐步6 若x ≥b,则退出本层循环. 步7 执行.6316364;1511516;3134;2212212212212C C R S S C T T S S h T T -⇐-⇐-⇐+⇐步8 执行.1;;;;;2;2121212112+⇐⇐⇐⇐⇐⇐-⇐k k R R C C S S T T hh R R e 步9 若e ≤ε且k ≥5,则退出循环. 步10 .22R R n ⇐ 步11 输出.2n R2、变步长梯形算法:功能 求积分⎰ba)(dx x f ,允许误差为ε。

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

实习题11用两种不容的顺序计算644834.1100012≈∑=-n n,分析误差的变化〔1〕顺序计算 源代码:#include<stdio.h> #include<math.h> void main() { double sum=0; int n=1; while(1) { sum=sum+(1/pow(n,2)); if(n%1000==0)printf("sun[%d]=%-30f",n,sum); if(n>=10000)break; n++; } printf("sum[%d]=%f\n",n,sum); }结果:〔2〕逆序计算 源代码:#include<stdio.h> #include<math.h> void main() { double sum=0; int n=10000; while(1) { sum=sum+(1/pow(n,2));if(n%1000==0) printf("sum[%d]=%-30f",n,sum); if(n<=1)break; n--; } printf("sum[%d]=%f\n",n,sum); }结果:2连分数))//(.../(322101n n b a a b a b a b f ++++=利用下面的方法计算f:11)0,...,2,1(,d f n n i d a b d b d i i i i n n =--=+==++写一个程序,读入n,n n b a ,,计算并打印f 源代码:#include<stdio.h> #include<math.h> void main() { int i=0,n; float a[1024],b[1024],d[1024]; printf("please input n,n="); scanf("%d",&n); printf("\nplease input a[1] to a[n]:\n"); for(i=1;i<=n;i++) { printf("a[%d]=",i); scanf("%f",&a[i]);} printf("\nplease input b[0] to b[n]:\n"); for(i=0;i<=n;i++) { printf("b[%d]=",i); scanf("%f",&b[i]); } d[n]=b[n]; for(i=n-1;i>=0;i--) d[i]=b[i]+a[i+1]/d[i+1]; printf("\nf=%f\n",d[0]); }结果:3给出一个有效的算法和一个无效的算法计算积分⎰=+=10)10,...1,0(14n dx x x y n n 源代码:#include<stdio.h> #include<math.h> main() { double y_0=(1/4.0)*log(5),y_1; double y_2=(1.0/55.0+1.0/11.0)/2,y_3; int n=1,m=10; printf("有效算法输出结果:\n"); printf("y[0]=%-20f",y_0);while(1) { y_1=1.0/(4*n)+y_0/(-4.0); printf("y[%d]=%-20f",n,y_1); if(n>=10) break; y_0=y_1; n++; if(n%3==0) printf("\n"); } printf("\n 无效算法的输出结果:\n"); printf("y[10]=%-20f",y_2); while(1) { y_3=1.0/n-4.0*y_2; printf("y[%d]=%-20f",m-1,y_3); if(m<=1) break; y_2=y_3; m--; if(m%2==0) printf("\n"); } }结果:4设∑=-=Nj N j S 2211,其准确值为)11123(21+--N N (1)编制按从小到大顺序计算N S 的程序 (2)编制按从小到达的顺序计算N S 的程序(3)按两种顺序分别计算30000100001000,,S S S ,并指出有效位数源代码:#include<stdio.h> main() { int N; double SN[30000]; SN[30000]=(3.0/2.0-1.0/30000.0-1/30001.0)/2.0; for(N=30000;N>=2;N--) SN[N-1]=SN[N]-1.0/(N*N-1); printf("从大到小顺序计算:\nSN[1000]=%f\nSN[10000]=%f\nSN[30000]=%f\n",SN[1000],SN[10000],SN[30000]); SN[2]=(3.0/2-1.0/2.0-1/3.0)/2.0; for(N=3;N<=30000;N++) SN[N]=SN[N-1]+1.0/(N*N-1); printf("从小到大顺序计算:\nSN[1000]=%f\nSN[10000]=%f\nSN[30000]=%f\n",SN[1000],SN[10000],SN[30000]); }结果:实习题21.用牛顿法求以下方程的根2=-x e x01=-x xe 02lg =-+x x源代码:#include <stdio.h> #include <math.h>typedef float (*p)(float ); float ff1(float x) { return x*x-exp(x); }float ff2(float x) { return x*exp(x)-1; }float ff3(float x) { return log(x)+x-2; }float answer(float(*p)(float)) { int k=2; float m=1,n=-1,x2,a,b,c; if (p==ff3)n=2; printf("x[0] = %.4f, x[1] = %.4f, ",m,n); while (1) { if (fabs(m-n)<1e-4) break; a=p(n)*(n-m); b=p(n)-p(m); c=a/b; x2=n-c; m = n; n = x2; printf("x[%d] = %.4f, ",k,x2); k++; if (k%3==0) printf("\n"); }if (k%3!=0) printf("\n");printf("iteration times: %d, roots: %.4f\n ",k-2,n);return 0;}main(){printf("x*x-exp(x),\n");answer(ff1);printf("x*exp(x)-1,\n");answer(ff2);printf("lg(x)+x-2,\n");answer(ff3);return 0;}结果:2.编写一个割线法的程序,求解上述各方程源代码:#include<stdio.h>#include<math.h>float gexian(float,float);float f(float);main(){int i,j;float x1=2.2;float x2=2,x3;scanf("%d",&i);if(i==1)printf("%f",x1); else if(i==2) printf("%f",x2); else { for(j=3;j<=i;j++) { x3=gexian(x1,x2); x1=x2; x2=x3; } printf("%f",gexian(x1,x2)); } }float f(float x) { return (x*x-exp(x)); }float gexian(float x1,float x2) { return (x2-(f(x2)/(f(x2)-f(x1)))*(x2-x1)); }结果:实习题31用列主元消去法解以下方程组;⎪⎪⎩⎪⎪⎨⎧=++=-++--=+--=--+43443233312)1(421432143214321x x x x x x x x x x x x x x x ⎪⎪⎩⎪⎪⎨⎧=++--=++-=-+--=-+-4341220332282)2(432132143214321x x x x x x x x x x x x x x x 源程序:#include<stdio.h>#include<math.h>void ColPivot(float*,int,float[]);void ColPivot(float*c,int n,float x[]){int i,j,t,k;float p;for(i=0;i<=n-2;i++){k=i;for(j=i+1;j<=n-1;j++)if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))k=j;if(k!=i)for(j=i;j<=n;j++){p=*(c+i*(n+1)+j);*(c+i*(n+1)+j)=*(c+k*(n+1)+j);*(c+k*(n+1)+j)=p;}for(j=i+1;j<=n-1;j++){p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));}}for(i=n-1;i>=0;i--){for(j=n-1;j>=i+1;j--)(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));}}void main(){int i;float x[4];float c[4][5]={1,1,0,3,4,2,1,-1,1,1,3,-1,-1,3,-3,-1,2,3,-1,4};ColPivot(c[0],4,x);for(i=0;i<=3;i++)printf("x[%d]=%f\n",i,x[i]);}结果:第〔1〕题第〔2〕题2、源代码:#include<stdio.h>void main(){float x[4];int i;float a[4][5]={48,-24,0,-12,4,-24,24,12,12,4,0,6,20,2,-2,-6,6,2,16,-2};void DirectLU(float*,int,float[]);DirectLU(a[0],4,x);for(i=0;i<=3;i++)printf("x[%d]=%f\n",i,x[i]);}void DirectLU(float*u,int n,float x[]){int i,r,k;for(r=0;r<=n-1;r++){for(i=r;r<=n;i++)for(k=0;k<=r-1;k++)*(u+r*(n+1)+i)-=*(u+r*(n+1)+k)*(*(u+k*(n+1)+i));for(i=r+1;i<=n-1;i++){for(k=0;k<=r-1;k++)*(u+i*(n+1)+r)-=*(u+i*(n+1)+k)*(*(u+k*(n+1)+r));*(u+i*(n+1)+r)/=*(u+r*(n+1)+r);}}for(i=n-1;i>=0;i--){for(r=n-1;r>=i+1;r--)*(u+i*(n+1)+n)-=*(u+i*(n+1)+r)*x[r];x[i]=*(u+i*(n+1)+n)/(*(u+i*(n+1)+i));}}实习题41、源代码:#include<stdio.h>float Lagrange(float x[],float y[],float xx,int n) //n为〔n+1〕次插值;{int i,j;float *a,yy=0;a=new float[n];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];}delete a;return yy;}void main(){float x[5]={-3.0,-1.0,1.0,2.0,3.0};float y[5]={1.0,1.5,2.0,2.0,1.0};float xx1=-2,xx2=0,xx3=2.75,yy1,yy2,yy3;yy1=Lagrange(x,y,xx1,3);yy2=Lagrange(x,y,xx2,3);yy3=Lagrange(x,y,xx3,3);printf("x1=%-20f,y1=%f\n",xx1,yy1);printf("x2=%-20f,y2=%f\n",xx2,yy2);printf("x3=%-20f,y3=%f\n",xx3,yy3);}结果:2、源代码:#include<stdio.h>float Lagrange(float x[],float y[],float xx,int n) //n为〔n+1〕次插值;{int i,j;float *a,yy=0;a=new float[n];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];}delete a;return yy;}void main(){float x[6]={0.30,0.42,0.50,0.58,0.66,0.72};float y[6]={1.04403,1.08462,1.11803,1.15603,1.19817,1.23223};float xx1=0.46,xx2=0.55,xx3=0.60,yy1,yy2,yy3;yy1=Lagrange(x,y,xx1,6);yy2=Lagrange(x,y,xx2,6);yy3=Lagrange(x,y,xx3,6);printf("x1=%-20f,y1=%f\n",xx1,yy1);printf("x2=%-20f,y2=%f\n",xx2,yy2);printf("x3=%-20f,y3=%f\n",xx3,yy3);}结果:源代码:#include<stdio.h>#define N 3void Difference(float y[],float f[4][4],int n){int k,i;f[0][0]=y[0];f[1][0]=y[1];f[2][0]=y[2];f[3][0]=y[3];for(k=1;k<=n;k++)for(i=0;i<=(N-k);i++)f[i][k]=f[i+1][k-1]-f[i][k-1];return;}void main(){int i,k=1;float a,b=1,m=21.4,t=1.4,f[4][4]={0};float x[5]={20,21,22,23,24};float y[5]={1.30103,1.32222,1.34242,1.36173,1.38021};Difference(y,f,N);a=f[0][0];for(i=1;i<=N;i++){k=k*i;b=b*(t-i+1);a=a+b*f[0][i]/k;}printf("x(k)\n");for (i=0;i<=4;i++)printf( "%-20f",x[i]);printf("\ny(k)\n");for (i=0;i<=4;i++)printf("%-20f",y[i]);for(k=1;k<=3;k++){printf("\nF(%d)\n ",k);for(i=0;i<=(3-k);i++){printf("%-20f",f[i][k]);}}printf ("\n");printf("f(%f)=%-20f",m,a);printf ("\n");结果:实习题52、源代码:#include<stdio.h>#include<math.h>void main(){int i,n;float a[2];float x[15]={1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8},z[15];floaty[15]={33.4,79.50,122.65,159.05,189.15,214.15,238.65,252.50,267.55,280.50,296.65,301.40,310. 40,318.15,325.15};for(n=0;n<=14;n++) //增加了数组z;{z[n]=log(y[n]/x[n]);}void Approx(float[],float[],int,int,float[]);Approx(x,z,15,1,a); //变成一次拟合;//for(i=0;i<=1;i++)//printf("a[%d]=%f\n",i,a[i]);printf("a=exp(a[0])=%f\n",exp(a[0]));printf("b=-a[1]=%f\n",-a[1]); }void Approx(float x[],float y[],int m,int n,float a[]){int i,j,t;float *c=new float[(n+1)*(n+2)];float power(int,float);void ColPivot(float *,int,float[]);for(i=0;i<=n;i++){for(j=0;j<=n;j++){*(c+i*(n+2)+j)=0;for(t=0;t<=m-1;t++)*(c+i*(n+2)+j)+=power(i+j,x[t]);}*(c+i*(n+2)+n+1)=0;for(j=0;j<=m-1;j++)*(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);}ColPivot(c,n+1,a);delete c;}void ColPivot(float *c,int n,float x[]){int i,j,t,k;float p;for(i=0;i<=n-2;i++){k=i;for(j=i+1;j<=n-1;j++)if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))k=j;if(k!=i)for(j=i;j<=n;j++){p=*(c+i*(n+1)+j);*(c+i*(n+1)+j)=*(c+k*(n+1)+j);*(c+k*(n+1)+j)=p;}for(j=i+1;j<=n-1;j++){p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));}}for(i=n-1;i>=0;i--){for(j=n-1;j>=i+1;j--)(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));}float power(int i,float v){float a=1;while(i--)a*=v;return a;}结果:实习题61、源代码:〔1〕#include<stdio.h>#include<math.h>float Cotes(float(*f)(float),float a,float b,int n){int k;float c,c1=0,c2,c3,c4;float h=(b-a)/n;c2=(*f)(a+h/4);c3=(*f)(a+h/2);c4=(*f)(a+3*h/4);for(k=1;k<=n-1;k++){c1+=(*f)(a+k*h);c2+=(*f)(a+k*h+h/4);c3+=(*f)(a+k*h+h/2);c4+=(*f)(a+k*h+3*h/4);}c=h/90*(7*((*f)(a)+(*f)(b))+14*c1+32*c2+12*c3+32*c4);return c;}float f(float x){return 1/sqrt(1+x*x*x);}void main()int i,n=4;float c;for(i=0;i<=4;i++){c=Cotes(f,0,1,n);printf("C(%d)=%f\n",n,c);n*=2;}}〔2〕#include<stdio.h>#include<math.h>float Cotes(float(*f)(float),float a,float b,int n){int k;float c,c1=0,c2,c3,c4;float h=(b-a)/n;c2=(*f)(a+h/4);c3=(*f)(a+h/2);c4=(*f)(a+3*h/4);for(k=1;k<=n-1;k++){c1+=(*f)(a+k*h);c2+=(*f)(a+k*h+h/4);c3+=(*f)(a+k*h+h/2);c4+=(*f)(a+k*h+3*h/4);}c=h/90*(7*((*f)(a)+(*f)(b))+14*c1+32*c2+12*c3+32*c4);return c;}float f(float x){ // return 1/sqrt(1+x*x*x);if (x==0)return 1;else return sin(x)/x;}void main(){int i,n=4;float c;for(i=0;i<=4;i++){// c=Cotes(f,0,1,n);c=Cotes(f,0,5,n);printf("C(%d)=%f\n",n,c);n*=2;}}结果:〔1〕〔2〕实习题7 一、改良欧拉法1、#include<stdio.h>#include<iostream>double Adams (double (*f)(double x, double y),double x0,double y0,double h,int N) {for(int n=0; n<N; ++n) {double x1=x0+h;double yp=y0+h*f(x0,y0);double y1=y0+h*f(x1,yp);y1=(yp+y1)/2.0;printf("ty=%f\n",y1);x0=x1;y0=y1;}}int main(void){double f(double x, double y); double x0=0,y0=0;double x,y,step;long i;step=0.1;Adams(f,x0,y0,0.1,10);}double f(double x, double y) {double r;r=x*x+y*y;return(r);}2、int main(void){double f(double x, double y); double x0=0,y0=0;double x,y,step;long i;step=0.1;Adams(f,x0,y0,0.1,10);}double f(double x, double y) {double r;r=1/(1+y*y);return(r);}3、int main(void){double f(double x, double y); double x0=0,y0=1;double x,y,step;long i;step=0.1;Adams(f,x0,y0,0.1,10);}double f(double x, double y) {double r;r=y-2*x/y;return(r);}四阶龙格库塔法1、#include<iostream>#include<stdio.h>using namespace std;//f为函数的入口地址,x0、y0为初值,xn为所求点,step为计算次数double Runge_Kuta( double (*f)(double x, double y), double x0, double y0, double xn, long step ) {double k1,k2,k3,k4,result;double h=(xn-x0)/step;if(step<=0)return(y0);if(step==1){k1=f(x0,y0);k2=f(x0+h/2, y0+h*k1/2);k3=f(x0+h/2, y0+h*k2/2);k4=f(x0+h, y0+h*k3);result=y0+h*(k1+2*k2+2*k3+k4)/6;}else{double x1,y1;x1=xn-h;y1=Runge_Kuta(f, x0, y0, xn-h,step-1);k1=f(x1,y1);k2=f(x1+h/2, y1+h*k1/2);k3=f(x1+h/2, y1+h*k2/2);k4=f(x1+h, y1+h*k3);result=y1+h*(k1+2*k2+2*k3+k4)/6;}printf("%lg\n",result);return(result);}int main(void){double f(double x, double y);double x0=0,y0=0,k;double x,y,step;long i;step=0.1;cout.precision(10);//for(i=0;i<=10;i++)//{// x=x0+i*step;// cout<<x<<" - "<<Runge_Kuta(f,x0,y0,x,i)<<endl; //}//cout<<Runge_Kuta(f,x0,y0,1,10);k= Runge_Kuta(f,x0,y0,1,10);}double f(double x, double y){double r;r=x*x+y*y;return(r);}2、int main(void){double f(double x, double y);double x0=0,y0=0,k;double x,y,step;long i;step=0.1;cout.precision(10);//for(i=0;i<=10;i++)//{// x=x0+i*step;// cout<<x<<" - "<<Runge_Kuta(f,x0,y0,x,i)<<endl; //}//cout<<Runge_Kuta(f,x0,y0,1,10);k= Runge_Kuta(f,x0,y0,1,10);}double f(double x, double y){double r;r=1/〔1+y*y〕;return(r);}3、int main(void){double f(double x, double y);double x0=0,y0=0,k;double x,y,step;long i;step=0.1;cout.precision(10);//for(i=0;i<=10;i++)//{// x=x0+i*step;// cout<<x<<" - "<<Runge_Kuta(f,x0,y0,x,i)<<endl; //}//cout<<Runge_Kuta(f,x0,y0,1,10);k= Runge_Kuta(f,x0,y0,1,10);}double f(double x, double y){double r;r=1/〔1+y*y〕;return(r);}二、int main(void){double f(double x, double y);double x0=0,y0=1,k;double x,y,step;long i;step=0.1;cout.precision(10);//for(i=0;i<=10;i++)//{// x=x0+i*step;// cout<<x<<" - "<<Runge_Kuta(f,x0,y0,x,i)<<endl;//}//cout<<Runge_Kuta(f,x0,y0,1,10);k= Runge_Kuta(f,x0,y0,1,10);}double f(double x, double y){double r;r=y-2*x/y;return(r);}三、1、void Runge_Kutta(float(*f)(float x,float y),float a,float b,float y0,int N,float yy[]) {float x=a,y=y0,K1,K2,K3,K4;float h=(b-a)/N;int i;for(i=1;i<=3;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/2,y+h*K3);y=y+h*(K1+2*K2+2*K2+2*K3+K4)/6;x=a+i*h;yy[i-1]=y;}}void Adams (float a,float b,int N,float(*f)(float x,float y),float y0){int i;float y1,y2,y,yp,yc,yy[3],h,x;printf("x[0]=%f\ty[0]=%f\n",a,y0);Runge_Kutta(f,a,b,y0,N,yy);y1=yy[0];y2=yy[1];y=yy[2];h=(b-a)/N;for(i=1;i<=3;i++)printf("x[%d]=%f\ty[%d]=%f\n",i,a+i*h,i,yy[i-1]);for(i=3;i<N;i++){x=a+i*h;yp=y+h*(55*f(x,y)-59*f(x-h,y2)+37*f(x-2*h,y1)-9*f(x-3*h,y0))/24;yc=y+h*(9*(*f)(x+h,yp)+19*(*f)(x,y)-5*(*f)(x-h,y2)+(*f)(x-2*h,y1))/24;printf("x[%d]=%f\ty[%d]=%f\n",i+1,x+h,i+1,yc);y0=y1;y1=y2;y2=y;y=yc;}}float f(float x,float y){return y*y;void Runge_Kutta(float(*f)(float x,float y),float a,float,float b,float y0,int N,float yy[]); void Adams (float a,float b,int N,float(*f)(float x,float y),float y0);float f(float x,float y);int main (void){float a=0,b=1,y0=1;int N=10;Adams(a,b,N,f,y0);}2、#include<stdio.h>void Runge_Kutta(float(*f)(float x,float y),float a,float b,float y0,int N,float yy[]) {float x=a,y=y0,K1,K2,K3,K4;float h=(b-a)/N;int i;for(i=1;i<=3;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/2,y+h*K3);y=y+h*(K1+2*K2+2*K2+2*K3+K4)/6;x=a+i*h;yy[i-1]=y;}}void Adams (float a,float b,int N,float(*f)(float x,float y),float y0)int i;float y1,y2,y,yp,yc,yy[3],h,x;printf("x[0]=%f\ty[0]=%f\n",a,y0);Runge_Kutta(f,a,b,y0,N,yy);y1=yy[0];y2=yy[1];y=yy[2];h=(b-a)/N;for(i=1;i<=3;i++)printf("x[%d]=%f\ty[%d]=%f\n",i,a+i*h,i,yy[i-1]);for(i=3;i<N;i++){x=a+i*h;yp=y+h*(55*f(x,y)-59*f(x-h,y2)+37*f(x-2*h,y1)-9*f(x-3*h,y0))/24;yc=y+h*(9*(*f)(x+h,yp)+19*(*f)(x,y)-5*(*f)(x-h,y2)+(*f)(x-2*h,y1))/24;printf("x[%d]=%f\ty[%d]=%f\n",i+1,x+h,i+1,yc);y0=y1;y1=y2;y2=y;y=yc;}}float f(float x,float y){return 0.1*(x*x*x+y*y);}void Runge_Kutta(float(*f)(float x,float y),float a,float,float b,float y0,int N,float yy[]); void Adams (float a,float b,int N,float(*f)(float x,float y),float y0);float f(float x,float y);int main (void){float a=0,b=1,y0=1;int N=10;Adams(a,b,N,f,y0);}。

相关文档
最新文档