2次型转化为标准型代码

来源:互联网 发布:mac sublime 菜单栏 编辑:程序博客网 时间:2024/06/06 08:55

线性代数中已经证明:对于任意一个对实称矩阵A,必然存在可逆矩阵C,满足 C1 * A * C 是对角矩阵,其中C1为C的转置。一下为实现代码。

package myMatrix;

import java.io.*;

import java.util.*;

public class matrix {

public doublearr[][];

public intr,c;

matrix(int r,intc){

this.r =r;

this.c =c;

arr = new double [r][c];

for(inti = 0;i < r;i++){

for(intj = 0;j < c;j++){

arr[i][j] = 0;

}

}

}

matrix(matrix s){

r = s.r;

c = s.c;

arr = new double [r][c];

for(inti = 0;i < r;i++){

for(intj = 0;j < c;j++){

arr[i][j] =s.arr[i][j];

}

}

}

void change(inti,int j,doublev){

if(i >= 0 &&i< r && j >= 0 &&j < c){

arr[i][j] =v;

}

}

void swap(inti,int j, boolean row){

if(i !=j){

if(row ==true){

if(i >= 0 &&i< r && j >= 0 &&j < r){

for(ints = 0; s < c;s++){

doubletep = arr[i][s];

arr[i][s] =arr[j][s];

arr[j][s] =tep;

}

}

} elseif(row == false) {

if(i >= 0 &&i< c && j >= 0 &&j < c){

for(ints = 0; s < r;s++){

doubletep = arr[s][i];

arr[s][i] =arr[s][j];

arr[s][j] =tep;

}

}

}

}

}

void moveTo(inti,int j, double mul, boolean row){

if(row ==true){

if(i >= 0 &&i< r && j >= 0 &&j < r){

for(ints = 0; s < c;s++){

arr[j][s] +=arr[i][s] *mul;

}

}

} elseif(row == false) {

if(i >= 0 &&i< c && j >= 0 &&j < c){

for(ints = 0; s < r;s++){

arr[s][j] +=arr[s][i] *mul;

}

}

}

}

public String toString(){

String res = String.valueOf(r) +" " + String.valueOf(c) + "\n";

for(inti = 0; i < r;i++){

for(intj = 0; j < c;j++){

res += String.valueOf(arr[i][j]) +" ";

}

res +="\n";

}

returnres;

}

public static matrix getE(intn){

matrix e = new matrix(n,n);

for(inti = 0; i < n;i++){

e.arr[i][i] = 1;

}

returne;

}

public static matrix generateRondom(intr,int c,intrange){

Random ra = new Random();

matrix t = new matrix(r,c);

for(inti = 0;i < r;i++){

for(intj = 0;j < c;j++){

t.arr[i][j] =ra.nextInt(range);

if(ra.nextBoolean()){

t.arr[i][j] *= -1;

}

}

}

returnt;

}

public staticboolean compare(matrix a,matrix b){

if(a.r !=b.r || a.c !=b.c) {

returnfalse;

}

for(inti = 0; i < a.r;i++){

for(intj =0; j < a.c;j++){

if(Math.abs(a.arr[i][j] -b.arr[i][j]) >= 1e-10){

returnfalse;

}

}

}

returntrue;

}

public static matrix multiply(matrixa,matrix b){

if(a.c !=b.r){

returnnull;

}

matrix res = new matrix(a.r,b.c);

for(inti = 0; i < a.r;i++){

for(intj = 0; j < b.c;j++){

doublesum = 0;

for(ints = 0; s < a.c;s++){

sum +=a.arr[i][s] *b.arr[s][j];

}

res.change(i,j, sum);

}

}

return res;

}

public static matrix getReverse(matrixa){

matrix res = new matrix(a.c, a.r);

for(inti = 0; i < a.r;i++){

for(intj = 0; j < a.c;j++){

res.change(j,i, a.arr[i][j]);

}

}

returnres;

}

public static matrix getCForsymmetricalMatrix(matrixtep){

if(tep.r !=tep.c){

returnnull;

}

for(inti = 0; i < tep.r;i++){

for(intj = i + 1; j <tep.r; j++) {

if(tep.arr[i][j] !=tep.arr[j][i]){

returnnull;

}

}

}

matrix copy = new matrix(tep);

matrix t = new matrix(tep);

matrix res = getE(t.r);

for(inti = 0; i < t.r;i++){

if(Math.abs(t.arr[i][i]) < 1e-10) {

t.arr[i][i] = 0;

intj = i + 1;

for(;j <t.r; j++) {

if(Math.abs(t.arr[i][j]) >= 1e-10){

break;

}

}

if(j ==t.r) {

continue;

}

if(Math.abs(t.arr[j][j]) < 1e-10) {

t.moveTo(i,j, 1, true);

t.moveTo(i,j, 1, false);

res.moveTo(i,j, 1, false);

}

t.swap(i,j, true);

t.swap(i,j, false);

res.swap(i,j, false);

}

for(intj = i + 1; j <t.r; j++){

if(Math.abs(t.arr[i][j]) >= 1e-10) {

doubletep1 = t.arr[i][j];

t.moveTo(i,j, -tep1/t.arr[i][i],true);

t.moveTo(i,j, -tep1/t.arr[i][i],false);

res.moveTo(i,j, -tep1/t.arr[i][i],false);

}

}

}

//System.out.println("ter---" + t);

//System.out.println(multiply(multiply(getReverse(res),copy),res));

if(compare(t, multiply(multiply(getReverse(res),copy),res)) ==false) {

returnnull;

}

returnres;

}

public staticvoid main(String[] args) throws IOException {

int count = 1000000;

intCase = count;

int succ = 0;

while(Case != 0) {

Case--;

int n = 8;

matrix t = generateRondom(n,n,2);

for(inti = 0; i < n;i++) {

for(intj = i + 1; j <n; j++){

t.arr[j][i] =t.arr[i][j];

}

}

matrix c = getCForsymmetricalMatrix(t);

if(c !=null){

succ++;

} else {

System.out.println("error");

}

}

System.out.println(succ ==count);

System.out.println(succ);

System.out.println(count);

}

}

0 0
原创粉丝点击