package delta;
import tool.*;
public class pro {
int s,datanumber;
String[] data=new String[5000];
double[] y=new double[5000];
double[] p=new double[5000];
double[] dp=new double[5000];
double[] k=new double[5000];
double[] sol=new double[500];
double alpha,beta;
double[][] x=new double[500][10];
double sig1,avg1,sig2,avg2;
public static void main(String[] args) {
pro te=new pro();
}
pro(){
catchdata sub2=new catchdata();
sub2.makedata();
p=sub2.p;
y=sub2.y;
datanumber=sub2.datanumber;
datanumber=datanumber-2;
k[1]=100;
dp[1]=0;
for(s=2;s<datanumber+1;s++){
dp[s]=p[s]-p[s-1];
k[s]=100;
}
int tr;
for(tr=1;tr<6;tr++){
for(s=1;s<datanumber+1;s++){
x[s][1]=1;
x[s][2]=y[s]-k[s];
}
ols sub=new ols();
sub.datanumber=datanumber;
sub.x=x;
sub.y=dp;
sub.number=2;
sub.makedata();
sol=sub.sol;
alpha=sol[1];
beta=sol[2];
double a1=0;
for(s=1;s<datanumber+1;s++){
double x1=(dp[s]-alpha-beta*(y[s]-k[s]));
a1=a1+x1;
}
avg1=a1/datanumber;
double s1=0;
for(s=1;s<datanumber+1;s++){
double x1=(dp[s]-alpha-beta*(y[s]-k[s]));
s1=s1+(x1-avg1)*(x1-avg1);
}
sig1=s1/datanumber;
double a2=0;
for(s=2;s<datanumber+1;s++){
double x2=y[s]-y[s-1];
a2=a2+x2;
}
avg2=a2/datanumber;
double s2=0;
for(s=1;s<datanumber+1;s++){
double x2=y[s]-y[s-1];
s2=s2+(x2-avg2)*(x2-avg2);
}
sig2=s2/datanumber;
optimal sub3=new optimal();
sub3.alpha=alpha;
sub3.beta=beta;
sub3.sig1=sig1;
sub3.sig2=sig2;
sub3.avg1=avg1;
sub3.avg2=avg2;
sub3.dp=dp;
sub3.y=y;
sub3.datanumber=datanumber;
sub3.makedata();
k=sub3.k;
}
System.out.println(alpha+","+beta);
for(s=1;s<datanumber+1;s++){
System.out.println(y[s]+","+k[s]);
}
}
}
package delta;
public class optimal {
double alpha,beta;
double sig1,sig2,avg1,avg2;
double[] dp=new double[500];
double[][] v=new double[300][403];
double[] ks=new double[401];
double[] y=new double[401];
int number;
int[][] gotok=new int[200][400];
int[] op=new int[500];
double[] k=new double[201];
int datanumber;
void makedata(){
int s;
for(s=1;s<400;s++){
ks[s]=80+0.1*s;
}
for(s=1;s<400;s++){
v[1][s]=f(dp[1],y[1],ks[s]);
}
int t,sx;
for(t=2;t<datanumber+1;t++){
for(s=1;s<400;s++){
double u1=f(dp[t],y[t],ks[s]);
double maxv=-999999999;
int sxs=0;
for(sx=1;sx<400;sx++){
double v1=u1+g(ks[s],ks[sx])+v[t-1][sx];
if(v1>maxv)sxs=sx;
if(v1>maxv)maxv=v1;
}
gotok[t][s]=sxs;
v[t][s]=maxv;
}
}
double maxv=-99999;
int sxs=0;
for(s=1;s<400;s++){
if(v[datanumber][s]>maxv)sxs=s;
if(v[datanumber][s]>maxv)maxv=v[datanumber][s];
}
op[datanumber]=sxs;
for(s=1;s<datanumber;s++){
t=datanumber+1-s;
sxs=op[t];
op[t-1]=gotok[t][sxs];
}
for(s=1;s<datanumber+1;s++){
sxs=op[s];
k[s]=ks[sxs];
}
}
double f(double p1,double yy,double k3){
double x1=p1-alpha-beta*(yy-k3);
double x2=p1-alpha-beta*(yy-k3);
double f1=-(x1-avg1)*(x1-avg1)/(sig1*sig1);
return f1;
}
double g(double k1,double k2){
double x1=k1-k2;
double f1=-(x1-avg2)*(x1-avg2)/(sig2*sig2);
return f1;
}
}
package delta;
public class ols {
int s,s1,s2;
int datanumber,number;
double x1;
double[][] a=new double[100][100];
double[] b=new double[100];
double[] y=new double[1000];
double[][] x=new double[1000][10];
double[] sol=new double[100];
void makedata(){
for(s1=1;s1<number+1;s1++){
for(s2=1;s2<number+1;s2++){
x1=0;
for(s=1;s<datanumber+1;s++){
x1=x1+x[s][s1]*x[s][s2];
}
a[s1][s2]=x1;
}
}
for(s1=1;s1<number+1;s1++){
x1=0;
for(s=1;s<datanumber+1;s++){
x1=x1+x[s][s1]*y[s];
}
b[s1]=x1;
}
double z;
for(s1=1;s1<number+1;s1++){
for(s2=1;s2<number+1;s2++){
z=a[s2][s1]/a[s1][s1];
if(s1==s2)z=0;
for(s=1;s<number+1;s++){
a[s2][s]=a[s2][s]-z*a[s1][s];
}
b[s2]=b[s2]-z*b[s1];
}
}
for(s1=1;s1<number+1;s1++){
sol[s1]=b[s1]/a[s1][s1];
}
}
}
package delta;
import tool.*;
public class catchdata {
int s,datanumber;
String[] data=new String[5000];
double[] y=new double[5000];
double[] p=new double[5000];
void makedata(){
readfile sub2=new readfile();
sub2.makedata("data.csv","UTF-8");
data=sub2.data;
datanumber=sub2.datanumber;
for(s=2;s<datanumber+1;s++){
String[] x=data[s].split(",");
y[s-1]=Double.parseDouble(x[2]);
}
datanumber=datanumber-1;
readfile sub3=new readfile();
sub3.makedata("datax.csv","UTF-8");
data=sub3.data;
datanumber=sub3.datanumber;
for(s=2;s<datanumber+1;s++){
String[] x=data[s].split(",");
p[s-1]=Double.parseDouble(x[2]);
}
datanumber=datanumber-1;
}
}
最終更新:2016年04月01日 02:47