static double f(double x)
{
Random K = new Random();
double d;
d=K.nextDouble();
d=d+1;
return Math.pow(x,d);
}
一部分主程序
{
int n=1; //初值
double a=-87,b=87;
double h,Tn,T2n,In,I2n;
double T;
n=1;
a=0;
b=87;
h=b-a;
T2n=I2n=h*(f(a)+f(b))/2;}
不知道为什么,程序一直在运行,得不出结果,如果我把d用一个数字代替,程序运行的很快,主程序是是算积分的,没问题的
double d;
d=K.nextDouble();
d=d+1;
System.out.println(""+d+" "+Math.pow(12.8, d));没有问题呀
double a1=-87,b1=87;
double h,Tn,T2n,In,I2n;
double T;
n=1;
a1=0;
b=87;
h=b1-a1;
T2n=I2n=h*(f(a1)+f(b1))/2;
System.out.println("T2n:"+T2n+"I2n: "+I2n+"h: "+h); }
static double f(double x)
{
Random K = new Random();
double d;
d=K.nextDouble();
d=d+1;
return Math.pow(x,d);
}
====
也没有问题
output:
T2n:4200.573506786256I2n: 4200.573506786256h: 87.0
import java.io.*;
import java.util.Random;
import java.lang.Math;
public class Markov10
{
public static void main(String[] args) throws IOException
{
int n=1; //初值
double a,bh,Tn,T2n,In,I2n,T,eps=10e-8;
FileWriter file2 = new FileWriter("ov.txt");
PrintWriter outputFile1 = new PrintWriter(file2);
{
a=1;b=87;
h=b-a;
T2n=I2n=h*(f(a)+f(b))/2;
In=0;
while(Math.abs(I2n-In)>=eps) //求积分
{
Tn=T2n;
In=I2n;
double sigma=0.0;
for(int k=0;k<n; k++) //求变步长梯形的和部分
{
double x=a+(k+0.5)*h;
sigma+=f(x);
}
T2n=(Tn+h*sigma)/2.0; //变步长梯形
I2n=(4*T2n-Tn)/3.0; //辛普生公式
n*=2; //划分
h/=2;
}
outputFile1.print(I2n+" ");
}
outputFile1.println();
outputFile1.close();
System.out.println("\nThe end.");
}
static double f(double x)
{
Random K = new Random();
double d,r;
d=K.nextDouble();
return Math.pow(x,d);
}
}
里面的d如果随便换成一个数字1或1.23424,马上出结果
while(Math.abs(I2n-In)>=eps) //求积分这个要在I2n对1-1.9999999999的数都是收敛的前提下才可行吧
这个我倒不敢怀疑我不太了解这个逐步求精公式
LZ 再对对步骤?再就是你把1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9都试下,如果这里边都有问题,那就是步骤的问题了
for(int k=0;k<n; k++) //求变步长梯形的和部分
{
double x=a+(k+0.5)*h;
sigma+=f(x); //******这又调用函数f,就是说每一次都累加一个不同的数
} 出现了死循环!
还有就是K.nextDouble()产生0~1的数:你的1.0,1.234??不合条件呀再次建议检查步骤
for(int k=0;k<n; k++) //求变步长梯形的和部分
{
double x=a+(k+0.5)*h;
sigma+=f(x); //******这又调用函数f,就是说每一次都累加一个不同的数
}
我也觉得是这里有问题,这话删了,就马上出结果