📄 min_polynomial_way.java
字号:
public class Min_Polynomial_Way
{
public double[][]G;
public double[][]D;
public double [][]temp;
public double[]x;
public double[]y;
public int length;
public int dim;
public RealPoint [] result;
public double []syntax;
public String Expression;
public Min_Polynomial_Way(RealPoint[] data,int dim)
{
this.length=data.length;
this.dim=dim;
x=new double[length];
y=new double[length];
result=new RealPoint[length];
D=new double[dim][1];
G=new double[dim][dim];
temp=new double[dim][1];
syntax=new double[dim];
for(int i=0;i<length;i++)
{
x[i]=data[i].x;
y[i]=data[i].y;
result[i] =new RealPoint(x[i],0);
System.out.println("x[i] is"+x[i]+"y[i] is"+y[i]);
}
for(int i=0;i<dim;i++)
{
for(int j=0;j<dim;j++)
{
for(int k=0;k<length;k++)
G[i][j]+=Math.pow(x[k],i)*Math.pow(x[k],j);
System.out.println("G[i][j] is"+G[i][j]);
}
}
for(int i=0;i<dim;i++)
{
for(int k=0;k<length;k++)
D[i][0]+=Math.pow(x[k],i)*y[k];
}
}
public RealPoint[] Processing()
{
Inverse_Cal(G,dim);
//for(int i=0;i<dim;i++)
//for(int j=0;j<dim;j++)
//System.out.println(
Multi_Cal(G,D,temp,dim,dim,1);
for(int i=0;i<dim;i++)
{
System.out.println("temp is"+temp[i][0]);
syntax[i]=temp[i][0];
}
for(int i=0;i<length;i++)
{
for(int j=0;j<dim;j++)
{
result[i].y+=Math.pow(result[i].x,j)*syntax[j];
}
}
Expression=this.Get_Expression(syntax);
return result;
}
//get 误差
public double Get_Differ()
{
return 0.0;
}
private String Get_Expression(double syn[])
{
String s="算术表达式为:";
for(int i=0;i<syn.length;i++)
{
s=s+"+"+syn[i]+"*x^"+i;
}
return s;
}
public static void main(String[]args)
{
RealPoint[] p=new RealPoint[4];
for(int i=0;i<4;i++)
{
p[i]=new RealPoint((double)i/3,(double)i/3);
System.out.println(p[i].x+""+p[i].y);
}
Min_Polynomial_Way a=new Min_Polynomial_Way(p,2);
a.Processing();
System.out.println("The Expression is"+a.Expression);
}
public static void Inverse_Cal(double[][] a,int n)
{
int i,j,row,col,k;
double max,temp;
int[] p=new int[n];
double[][] b=new double[n][n];
for(i=0;i<n;i++){p[i]=i;b[i][i]=1;}
for(k=0;k<n;k++)
{//找主元
max=0;row=col=i;
for(i=k;i<n;i++)
for(j=k;j<n;j++)
{temp=Math.abs(b[i][j]);
if(max<temp){max=temp;row=i;col=j;}
}
//交换行列,将主元调整到k行k列上
if(row!=k)
{for(j=0;j<n;j++)
{temp=a[row][j];a[row][j]=a[k][j];a[k][j]=temp;
temp=b[row][j];b[row][j]=b[k][j];b[k][j]=temp;}
}
if(col!=k)
{for(i=0;i<n;i++)
{temp=a[i][col];a[i][col]=a[i][k];a[i][k]=temp;}
j=p[col];p[col]=p[k];p[k]=j;
}
//处理
for(j=k+1;j<n;j++)a[k][j]/=a[k][k];
for(j=0;j<n;j++)b[k][j]/=a[k][k];
a[k][k]=1;
for(j=k+1;j<n;j++)
{for(i=0;i<k;i++)a[i][j]-=a[i][k]*a[k][j];
for(i=k+1;i<n;i++)a[i][j]-=a[i][k]*a[k][j];}
for(j=0;j<n;j++)
{for(i=0;i<k;i++)b[i][j]-=a[i][k]*b[k][j];
for(i=k+1;i<n;i++)b[i][j]-=a[i][k]*b[k][j];}
for(i=0;i<k;i++)a[i][k]=0;
a[k][k]=1;
}
//恢复行列次序;
for(j=0;j<n;j++)
{for(i=0;i<n;i++)a[p[i]][j]=b[i][j];}
}
public void Multi_Cal(double[][] a,double[][] b,double[][]c,int m,int n,int l)
{double[][] d=new double[m][l];
int i,j,k;
for(i=0;i<m;i++)
for(j=0;j<l;j++)
{d[i][j]=0;
for(k=0;k<n;k++)d[i][j]+=a[i][k]*b[k][j];}
for(i=0;i<m;i++)
for(j=0;j<l;j++)
c[i][j]=d[i][j];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -