📄 sor.java
字号:
package matrix;
import gui.PepaConsole;
public class Sor {
private int[] ija;
private double[] sa;
public Sor(int[] i,double[] s)
{
ija=i;
sa=s;
}
public void solve(int matrixDim, double[] b, double[] x, double omega,
double tol, int itmax, int iteration, int norm, double err)
{
double[] prevX = new double [matrixDim + 1];
double[] difference = new double [matrixDim + 1];
double sum = 0.0;
for (int i = 1;i < matrixDim + 1; i++)
{
prevX[i] = (double) (1.0 / (matrixDim));
x[i] = 1.0/(matrixDim);
}
do {
sum = 0;
for (int i=1;i<= matrixDim;i++)
{
int initial = (ija[i]);
int last = (ija[i+1] -1);
x[i] = 0.0;
for (int j=initial;j <= last;j++)
{
if (ija[j] < i)
x[i] -= sa[j] * x[ija[j]];
else
x[i] -= sa[j] * prevX[ija[j]];
}
x[i] = (1.0 - omega)*prevX[i] + ((omega*(x[i] + b[i])) / sa[i]);
}
iteration++;
VectorSub(x, prevX, difference);
if (norm == 2)
err = Norm(difference);
else
err = infNorm(difference);
}
while ((err > tol) && (iteration < itmax));
PepaConsole.addArgument("--迭代次数:"+iteration+"\n");
if(iteration>=itmax)
PepaConsole.addArgument("--已经迭代到最大次数,得到的结果将不够精确,请增加迭代次数!\n");
PepaConsole.addArgument("--误差:"+err+"\n");
}
private static double Norm (double vector[])
{
double sum = 0.0;
int i;
for (i = 1; i < vector.length; i++)
sum += (vector[i] * vector[i]);
return java.lang.Math.sqrt(sum);
}
private static double infNorm (double vector[])
{
double sum = 0.0;
double tmp = 0.0;
int i;
for (i = 1; i < vector.length; i++)
{
tmp = java.lang.Math.abs(vector[i]);
if (sum < tmp);
sum = tmp;
}
return sum;
}
private static void VectorSub (double X[], double Y[], double Diff[])
{
int i=1;
while ((X.length == Y.length) && (i < Y.length))
{
Diff[i] = X[i] - Y[i];
Y[i] = X[i];
i++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -