一段VB代码如下:
Public Function funPolynomial(Num As Long, x() As Single, y() As Single, Degree As Integer, AA() As Single) As Long
Dim a() As Double, b() As Double, z() As Double
Dim i As Integer, j As Integer
Dim K As Integer, M As Integer
Dim lngError As Long
On Error GoTo errHandlerIf Num < Degree + 1 Then
'原始数据个数不够,不能拟合
funPolynomial = -1
Exit Function
End IfM = Degree + 1
ReDim a(M, M) As Double, b(M) As Double, z(M) As Double
'形成方程组的各元素
a(1, 1) = Num
For i = 1 To Num
b(1) = b(1) + y(i)
Next i
For j = 2 To M
For i = 1 To Num
a(1, j) = a(1, j) + x(i) ^ (j - 1)
Next i
Next j
For i = 2 To M
For j = 1 To M
For K = 1 To Num
a(i, j) = a(i, j) + x(K) ^ (i + j - 2)
If j = 1 Then
b(i) = b(i) + x(K) ^ (i - 1) * y(K)
End If
Next K
Next j
Next ilngError = SolveEquation(M, a, b, z)
If lngError = 0 Then
For i = 1 To M
AA(i - 1) = z(i)
Next i
funPolynomial = 0
Else
funPolynomial = lngError
End If
Exit FunctionerrHandler:
'计算出错
funPolynomial = -2
Exit Function
End Function
Private Function SolveEquation(N As Integer, a() As Double, b() As Double, z() As Double) As Long
Dim TempA As Double, ChuShu As Double, Sum As Double
Dim i As Integer, j As Integer
Dim II As Integer, L As Integer, K As Integer, KK As Integer
On Error GoTo errHandlerFor i = 1 To N
L = 0: KK = 0
For j = i To N
If a(j, i) = 0 Then L = L + 1
Next j
For j = i To N - L
If a(j, i) = 0 Then
KK = KK + 1
For K = i To N
TempA = a(j, K)
a(j, K) = a(N - KK + 1, K)
a(N - KK + 1, K) = TempA
Next K
TempA = b(j): b(j) = b(N - KK + 1): b(N - KK + 1) = TempA
End If
Next j
For II = i To N - L
ChuShu = a(II, i)
For j = i To N
a(II, j) = a(II, j) / ChuShu
Next j
b(II) = b(II) / ChuShu
Next II
For II = i + 1 To N - L
For j = i To N
a(II, j) = a(II, j) - a(i, j)
Next j
b(II) = b(II) - b(i)
Next II
Next i
For i = 1 To N
For j = 1 To i - 1
a(i, j) = 0
Next j
Next i
z(N) = b(N) / a(N, N)
For i = N - 1 To 1 Step -1
Sum = 0
For j = i + 1 To N
Sum = Sum + a(i, j) * z(j)
Next j
z(i) = (b(i) - Sum) / a(i, i)
Next iExit FunctionerrHandler:
'计算出错
SolveEquation = -3
Exit Function
End Function转为java代码如下:
public class Suanfa {
public void DuoXiangshi(int n,double[] x,double[] y,int degree)
{
int m = degree+1;
double[][] a = new double[m][m];
double [] b = new double[m];
double[] aa = new double[degree+2];
if(n<degree+1)
{
System.out.println("原始数据个数不够,不能拟合");
}
else
{
a[0][0] = n;
for(int i=1;i<=n;i++)
{
b[0]=b[0]+y[i-1];
}
for(int j=2;j<=m;j++)
{
for(int k=1;k<=n;k++)
{
a[0][j-1]=a[0][j-1]+Math.pow(x[k-1], (j-2));
}
}
for(int q=2;q<=m;q++)
{
for(int p=1;p<=m;p++)
{
for(int w=1;w<=n;w++)
{
a[q-1][p-1]=a[q-1][p-1]+Math.pow(x[w-1], (q+p-4));
System.out.println("a[][]="+a[q-1][p-1]);
if(p==1)
{
b[q-1]=b[q-1]+Math.pow(x[w-1], (q-2))*y[w-1];
}
System.out.println("b[][]="+b[q-1]);
}
}
}
Suanfa sf= new Suanfa();
double[] z = sf.SolveEquation(m,a,b);
for(int o=1;o<=m;o++)
{
aa[o-1]=z[o-1];
System.out.println("输出系数为:"+aa[o-1]);
}
}
}
public double[] SolveEquation(int n,double[][] a,double[] b)
{
double[] z = new double[n];
double tempa,chushu,sum;
int j,i,ii,l,k,kk;
for(i=1;i<=n;i++)
{
l=0;
kk=0;
for(j=i;j<=n;j++)
{
if(a[j-1][i-1]==0)
{
l=l+1;
}
}
for(j=i;j<=(n-l);j++)
{
if(a[j-1][i-1]==0)
{
kk=kk+1;
for(k=i;k<=n;k++)
{
tempa=a[j-1][k-1];
a[j-1][k-1]=a[n-kk+1][k-1];
a[n-kk+1][k-1]=tempa;
}
tempa=b[j-1];
b[j-1]=b[n-kk+1];
b[n-kk+1]=tempa;
}
}
for(ii=i;ii<=n-l;ii++)
{
chushu=a[ii-1][i-1];
for(j=i;j<=n;j++)
{
a[ii-1][j-1]=a[ii-1][j-1]/chushu;
}
b[ii-1]=b[ii-1]/chushu;
}
for(ii=i+1;ii<=n-l;ii++)
{
for(j=i;j<=n;j++)
{
a[ii-1][j-1]=a[ii-1][j-1]-a[i-1][j-1];
}
b[ii-1]=b[ii-1]-b[i-1];
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=i-1;j++)
{
a[i-1][j-1]=0;
}
}
z[n-1]=b[n-1]/a[n-1][n-1];//如果有错,改为n-1
for(i=n-1;i>=1;i--)
{
sum=0;
for(j=i+1;j<=n;j++)
{
sum=sum+a[i-1][j-1]*z[j-1];
}
z[i-1]=(b[i-1]-sum)/a[i-1][i-1];
}
return z;
}
public static void main(String abs[]){
Suanfa sf= new Suanfa();
double[] x={10,15,20,25,30,35,40,45,50};
double[] y={100,400,710,1135,1700,2285,3010,4000,4760};
sf.DuoXiangshi(9, x, y,2);
}
}结果代码算出的值有偏差,跪求达人赐教
Public Function funPolynomial(Num As Long, x() As Single, y() As Single, Degree As Integer, AA() As Single) As Long
Dim a() As Double, b() As Double, z() As Double
Dim i As Integer, j As Integer
Dim K As Integer, M As Integer
Dim lngError As Long
On Error GoTo errHandlerIf Num < Degree + 1 Then
'原始数据个数不够,不能拟合
funPolynomial = -1
Exit Function
End IfM = Degree + 1
ReDim a(M, M) As Double, b(M) As Double, z(M) As Double
'形成方程组的各元素
a(1, 1) = Num
For i = 1 To Num
b(1) = b(1) + y(i)
Next i
For j = 2 To M
For i = 1 To Num
a(1, j) = a(1, j) + x(i) ^ (j - 1)
Next i
Next j
For i = 2 To M
For j = 1 To M
For K = 1 To Num
a(i, j) = a(i, j) + x(K) ^ (i + j - 2)
If j = 1 Then
b(i) = b(i) + x(K) ^ (i - 1) * y(K)
End If
Next K
Next j
Next ilngError = SolveEquation(M, a, b, z)
If lngError = 0 Then
For i = 1 To M
AA(i - 1) = z(i)
Next i
funPolynomial = 0
Else
funPolynomial = lngError
End If
Exit FunctionerrHandler:
'计算出错
funPolynomial = -2
Exit Function
End Function
Private Function SolveEquation(N As Integer, a() As Double, b() As Double, z() As Double) As Long
Dim TempA As Double, ChuShu As Double, Sum As Double
Dim i As Integer, j As Integer
Dim II As Integer, L As Integer, K As Integer, KK As Integer
On Error GoTo errHandlerFor i = 1 To N
L = 0: KK = 0
For j = i To N
If a(j, i) = 0 Then L = L + 1
Next j
For j = i To N - L
If a(j, i) = 0 Then
KK = KK + 1
For K = i To N
TempA = a(j, K)
a(j, K) = a(N - KK + 1, K)
a(N - KK + 1, K) = TempA
Next K
TempA = b(j): b(j) = b(N - KK + 1): b(N - KK + 1) = TempA
End If
Next j
For II = i To N - L
ChuShu = a(II, i)
For j = i To N
a(II, j) = a(II, j) / ChuShu
Next j
b(II) = b(II) / ChuShu
Next II
For II = i + 1 To N - L
For j = i To N
a(II, j) = a(II, j) - a(i, j)
Next j
b(II) = b(II) - b(i)
Next II
Next i
For i = 1 To N
For j = 1 To i - 1
a(i, j) = 0
Next j
Next i
z(N) = b(N) / a(N, N)
For i = N - 1 To 1 Step -1
Sum = 0
For j = i + 1 To N
Sum = Sum + a(i, j) * z(j)
Next j
z(i) = (b(i) - Sum) / a(i, i)
Next iExit FunctionerrHandler:
'计算出错
SolveEquation = -3
Exit Function
End Function转为java代码如下:
public class Suanfa {
public void DuoXiangshi(int n,double[] x,double[] y,int degree)
{
int m = degree+1;
double[][] a = new double[m][m];
double [] b = new double[m];
double[] aa = new double[degree+2];
if(n<degree+1)
{
System.out.println("原始数据个数不够,不能拟合");
}
else
{
a[0][0] = n;
for(int i=1;i<=n;i++)
{
b[0]=b[0]+y[i-1];
}
for(int j=2;j<=m;j++)
{
for(int k=1;k<=n;k++)
{
a[0][j-1]=a[0][j-1]+Math.pow(x[k-1], (j-2));
}
}
for(int q=2;q<=m;q++)
{
for(int p=1;p<=m;p++)
{
for(int w=1;w<=n;w++)
{
a[q-1][p-1]=a[q-1][p-1]+Math.pow(x[w-1], (q+p-4));
System.out.println("a[][]="+a[q-1][p-1]);
if(p==1)
{
b[q-1]=b[q-1]+Math.pow(x[w-1], (q-2))*y[w-1];
}
System.out.println("b[][]="+b[q-1]);
}
}
}
Suanfa sf= new Suanfa();
double[] z = sf.SolveEquation(m,a,b);
for(int o=1;o<=m;o++)
{
aa[o-1]=z[o-1];
System.out.println("输出系数为:"+aa[o-1]);
}
}
}
public double[] SolveEquation(int n,double[][] a,double[] b)
{
double[] z = new double[n];
double tempa,chushu,sum;
int j,i,ii,l,k,kk;
for(i=1;i<=n;i++)
{
l=0;
kk=0;
for(j=i;j<=n;j++)
{
if(a[j-1][i-1]==0)
{
l=l+1;
}
}
for(j=i;j<=(n-l);j++)
{
if(a[j-1][i-1]==0)
{
kk=kk+1;
for(k=i;k<=n;k++)
{
tempa=a[j-1][k-1];
a[j-1][k-1]=a[n-kk+1][k-1];
a[n-kk+1][k-1]=tempa;
}
tempa=b[j-1];
b[j-1]=b[n-kk+1];
b[n-kk+1]=tempa;
}
}
for(ii=i;ii<=n-l;ii++)
{
chushu=a[ii-1][i-1];
for(j=i;j<=n;j++)
{
a[ii-1][j-1]=a[ii-1][j-1]/chushu;
}
b[ii-1]=b[ii-1]/chushu;
}
for(ii=i+1;ii<=n-l;ii++)
{
for(j=i;j<=n;j++)
{
a[ii-1][j-1]=a[ii-1][j-1]-a[i-1][j-1];
}
b[ii-1]=b[ii-1]-b[i-1];
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=i-1;j++)
{
a[i-1][j-1]=0;
}
}
z[n-1]=b[n-1]/a[n-1][n-1];//如果有错,改为n-1
for(i=n-1;i>=1;i--)
{
sum=0;
for(j=i+1;j<=n;j++)
{
sum=sum+a[i-1][j-1]*z[j-1];
}
z[i-1]=(b[i-1]-sum)/a[i-1][i-1];
}
return z;
}
public static void main(String abs[]){
Suanfa sf= new Suanfa();
double[] x={10,15,20,25,30,35,40,45,50};
double[] y={100,400,710,1135,1700,2285,3010,4000,4760};
sf.DuoXiangshi(9, x, y,2);
}
}结果代码算出的值有偏差,跪求达人赐教
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货