class tax{
int s,t,j,n1,n2,q,qx,nx1,nx2,nsc,nsy,e;
double th[]= new double[101];
double c[]= new double[101];
double y[]= new double[101];
double ux[][][]= new double[101][3][3];
double wx[][][]= new double[101][3][3];
double v[][][][]= new double[100][3][3][21];
int gotoc[][][][]= new int[100][3][3][21];
int gotoy[][][][]= new int[100][3][3][21];
int gotoq[][][][]= new int[100][3][3][21];
double endv[][]=new double[3][3];
int endc[][]=new int[3][3];
int endy[][]=new int[3][3];
int endq[][]=new int[3][3];
int opc[]= new int[101];
int opy[]= new int[101];
int opq[]= new int[101];
double tl,tr,w1,u1,c1,l1,vs,v1;
double h,dc,dy;
double yp1,yp2;
int pp;
public static void main(String args[]){
tax test=new tax();
}
tax(){
for (s=1;s<101;s++){
th[s]=0.02*s;
}
linear sub=new linear();
sub.th=th;
sub.makedata();
c=sub.c;
y=sub.y;
h=0.01;
t=0;
while(t<1000){
for (s=1;s<101;s++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
c1=c[s]+n1*h;
l1=(y[s]+n2*h)/th[s];
u1=u(c1,1-l1);
ux[s][n1+1][n2+1]=u1;
}
}
}
for (s=1;s<100;s++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
c1=c[s]+n1*h;
l1=(y[s]+n2*h)/th[s+1];
u1=u(c1,1-l1);
wx[s][n1+1][n2+1]=u1;
}
}
}
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
for (q=-10;q<11;q++){
v[1][n1+1][n2+1][q+10]=-999;
}
}
}
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
q=n2-n1;
v[1][n1+1][n2+1][q+10]=ux[1][n1+1][n2+1];
}
}
for (s=2;s<100;s++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
for (q=-10;q<11;q++){
u1=ux[s][n1+1][n2+1];
qx=q-n1+n2;
pp=0;
if (qx>10)pp=100;
if (qx<-10)pp=100;
if (pp>50)qx=0;
vs=-999;
nsc=0;
nsy=0;
yp1=y[s]+n2*h;
for (nx1=-1;nx1<2;nx1++){
for (nx2=-1;nx2<2;nx2++){
yp2=y[s-1]+nx2*h;
v1=u1+v[s-1][nx1+1][nx2+1][qx+10];
if (wx[s-1][nx1+1][nx2+1]>u1)v1=-999;
if(yp2>yp1)v1=-999;
if (v1>vs)nsc=nx1;
if (v1>vs)nsy=nx2;
if (v1>vs)vs=v1;
}
}
if (pp>50)vs=-999;
gotoc[s][n1+1][n2+1][q+10]=nsc;
gotoy[s][n1+1][n2+1][q+10]=nsy;
gotoq[s][n1+1][n2+1][q+10]=qx;
v[s][n1+1][n2+1][q+10]=vs;
}
}
}
}
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
u1=ux[100][n1+1][n2+1];
qx=n2-n1;
vs=-999;
nsc=0;
nsy=0;
for (nx1=-1;nx1<2;nx1++){
for (nx2=-1;nx2<2;nx2++){
v1=u1+v[99][nx1+1][nx2+1][qx+10];
if (wx[99][nx1+1][nx2+1]>u1)v1=-999;
if (v1>vs)nsc=nx1;
if (v1>vs)nsy=nx2;
if (v1>vs)vs=v1;
}
}
endc[n1+1][n2+1]=nsc;
endy[n1+1][n2+1]=nsy;
endq[n1+1][n2+1]=qx;
endv[n1+1][n2+1]=vs;
}
}
vs=-999;
nsc=0;
nsy=0;
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
if (endv[n1+1][n2+1]>vs)nsc=n1;
if (endv[n1+1][n2+1]>vs)nsy=n2;
if (endv[n1+1][n2+1]>vs)vs=endv[n1+1][n2+1];
}
}
opc[100]=nsc;
opy[100]=nsy;
opc[99]=endc[opc[100]+1][opy[100]+1];
opy[99]=endy[opc[100]+1][opy[100]+1];
opq[99]=endq[opc[100]+1][opy[100]+1];
for (j=1;j<99;j++){
s=99-j;
opc[s]=gotoc[s+1][opc[s+1]+1][opy[s+1]+1][opq[s+1]+10];
opy[s]=gotoy[s+1][opc[s+1]+1][opy[s+1]+1][opq[s+1]+10];
opq[s]=gotoq[s+1][opc[s+1]+1][opy[s+1]+1][opq[s+1]+10];
}
e=0;
for (s=1;s<101;s++){
e=e+opc[s]*opc[s]+opy[s]*opy[s];
}
for (s=1;s<101;s++){
c[s]=c[s]+opc[s]*h;
y[s]=y[s]+opy[s]*h;
}
if (e<2)h=h/2;
if (h<0.0001)t=10000;
t=t+1;
}
for (s=1;s<100;s++){
dy=y[s+1]-y[s];
dc=c[s+1]-c[s];
if (dy>0)System.out.println(1-dc/dy);
}
}
double u(double c1,double x1){
double u1,c2,x2;
int pp;
pp=0;
c2=c1;
x2=x1;
if (c2<0)pp=100;
if (x2<0)pp=100;
if (x2>1)pp=100;
if (x2==0)pp=100;
if (pp>50)c2=0.5;
if (pp>50)x2=0.5;
u1=Math.log(c2)+Math.log(x2);
if (pp>50)u1=-999;
return u1;
}
}
最終更新:2011年07月23日 16:28