计算物理课后部分习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五题
/*计算物理作业 3.5题
*学号:20092200129
*/
程序:
public class sun {
public static void main(String argv[]){
double del=1e-6;
int n=10,m=10;
double h=Math.PI/(2*n);
//Evaluate the derivative and output the result
int k=0;
for(int i=0;i<=n;++i){
double x=h*i;
double d=(f(x+h)-2*f(x)+f(x-h))/(h*h);
double f2=firstOrderDerivative3(x,h,d,del,k,m);
double df2=f2-O(x,f2);
System.out.println("x="+x);
System.out.println(" f"(x)="+f2);
System.out.println("Error in f"(x):"+df2);
System.out.println();
System.out.println();
}
}
//Method to carry out 2st-order derivative throuth the adaptive scheme.
public static double firstOrderDerivative3(double x,double h,double
d,double del,int step,int maxstep){
step++;
h=h/2;
double d2=(f(x+h)-2*f(x)+f(x-h))/(h*h);
if(step>=maxstep){
System.out.println("Not converged after"+step+"recursions");
return d2;
}
else{
if((h*h*Math.abs(d-d2)) return(4*d2-d)/3; else return firstOrderDerivative3(x,h,d2,del,step,maxstep); } } public static double f(double x){ return Math.exp(-x)*Math.log(x); } public static double O(double x,double f2){ return Math.exp(-x)*Math.log(x)-(2*Math.exp(-x))/x-Math.exp(-x)/(x*x); } } 运行结果: Not converged after10recursions x=0.0 f"(x)=NaN Error in f"(x):NaN x=0.15707963267948966 f"(x)=-47.10058585750553 Error in f"(x):3.329329885559673E-6 x=0.3141592653589793 f"(x)=-12.896114166464196 Error in f"(x):8.610592701074893E-7 x=0.47123889803846897 f"(x)=-5.929972627646059 Error in f"(x):1.254731920141694E-6 x=0.6283185307179586 f"(x)=-3.2974024228908525 Error in f"(x):2.3189374909193816E-7 x=0.7853981633974483 f"(x)=-2.010313400857776 Error in f"(x):1.0145469402367269E-6 x=0.9424777960769379 f"(x)=-1.2886478977422928 Error in f"(x):3.5448832647055895E-7 x=1.0995574287564276 f"(x)=-0.8495690372991292 Error in f"(x):1.4696104200240256E-7 x=1.2566370614359172 f"(x)=-0.568185223209793 Error in f"(x):6.901975246886849E-8 x=1.413716694115407 f"(x)=-0.38160076561659223 Error in f"(x):3.562357669961713E-8 x=1.5707963267948966 f"(x)=-0.25505577758216 Error in f"(x):3.170312274369813E-7 第六题 解题思路: 首先定义主函数,计算出x[i],f[i],然后调用两个子函数,两个子函数分别计算泰勒展开式求最后一项的结果和辛普森方法求得last slice的结果。 对于两个子函数来书直接用last=h*(5*y[n]+8*y[n-1]-y[n-2])/12 即可求得辛普森算法的最后一个的结果 而泰勒方法中最后一项等于=h*h*f(x0)的一阶导数/2+h*f[n-1]+h*h*h*f(x0)的二阶导数/二的阶乘。 对于f(x0)的一阶和二阶导数则由另外两个子程序分别计算 一阶导数=c[i]=(y[i+1]-y[i-1])/(2*h); 二阶导数c[i]=(y[i+1]-2*y[i]+y[i-1])/(h*h); 将所得值比较即可。 源程序: import ng.*; public class n2 { static final int n=9; public static void main (String argv[]){ double f[]= new double[n+1]; double h=Math.PI/(2.0*n);//定义均匀间隔