java实现高斯赛德尔算法解线性方程组

2023-11-16

package linear_equation;
 
import java.util.Scanner;
 
/*使用高斯赛德尔迭代法求解线性方程组*/
public class Gauss_Seidel_Iterate {
     /*求下三角*/
     private static float [][] find_lower( float data[][], int k){
         int length=data.length;
         float data2[][]= new float [length][length];
         if (k>= 0 ){
             for ( int i= 0 ;i<=length-k- 1 ;i++){
                 for ( int j= 0 ;j<=i+k;j++){
                     data2[i][j]=data[i][j];
                 }
             }
             for ( int i=length-k;i<length;i++){
                 for ( int j= 0 ;j<length;j++){
                     data2[i][j]=data[i][j];
                 }
             }
         }
         else {
             for ( int i=-k;i<length;i++){
                 for ( int j= 0 ;j<=i+k;j++){
                     data2[i][j]=data[i][j];
                 }
             }
         }
         return data2;
     }
     /*求原矩阵的负*/
     private static float [][] opposite_matrix( float [][] data){
         int M=data.length;
         int N=data[ 0 ].length;
         float data_temp[][]= new float [M][N];
         for ( int i= 0 ;i<M;i++){
             for ( int j= 0 ;j<N;j++){
                 data_temp[i][j]=-data[i][j];
             }
         }
         return data_temp;
     }
     /*原矩阵去掉第i+1行第j+1列后的剩余矩阵*/
     private static float [][] get_complement( float [][] data, int i, int j) {
 
         /* x和y为矩阵data的行数和列数 */
         int x = data.length;
         int y = data[ 0 ].length;
 
         /* data2为所求剩余矩阵 */
         float data2[][] = new float [x - 1 ][y - 1 ];
         for ( int k = 0 ; k < x - 1 ; k++) {
             if (k < i) {
                 for ( int kk = 0 ; kk < y - 1 ; kk++) {
                     if (kk < j) {
                         data2[k][kk] = data[k][kk];
                     } else {
                         data2[k][kk] = data[k][kk + 1 ];
                     }
                 }
 
             } else {
                 for ( int kk = 0 ; kk < y - 1 ; kk++) {
                     if (kk < j) {
                         data2[k][kk] = data[k + 1 ][kk];
                     } else {
                         data2[k][kk] = data[k + 1 ][kk + 1 ];
                     }
                 }
             }
         }
         return data2;
 
     }
     /* 计算矩阵行列式 */
     private static float cal_det( float [][] data) {
         float ans= 0 ;
         /*若为2*2的矩阵可直接求值并返回*/
         if (data[ 0 ].length== 2 ){
              ans=data[ 0 ][ 0 ]*data[ 1 ][ 1 ]-data[ 0 ][ 1 ]*data[ 1 ][ 0 ];
         }
         else {
             for ( int i= 0 ;i<data[ 0 ].length;i++){
                 /*若矩阵不为2*2那么需求出矩阵第一行代数余子式的和*/
                 float [][] data_temp=get_complement(data, 0 , i);
                 if (i% 2 == 0 ){
                     /*递归*/
                     ans=ans+data[ 0 ][i]*cal_det(data_temp);
                 }
                 else {
                     ans=ans-data[ 0 ][i]*cal_det(data_temp);
                 }
             }
         }
         return ans;
 
     }
     
     /*计算矩阵的伴随矩阵*/
     private static float [][] ajoint( float [][] data) {
         int M=data.length;
         int N=data[ 0 ].length;
         float data2[][]= new float [M][N];
         for ( int i= 0 ;i<M;i++){
             for ( int j= 0 ;j<N;j++){
             if ((i+j)% 2 == 0 ){
                 data2[i][j]=cal_det(get_complement(data, i, j));
             }
             else {
                 data2[i][j]=-cal_det(get_complement(data, i, j));
             }
             }
         }
         
         return trans(data2);
         
 
     }
     
     /*转置矩阵*/
     private static float [][]trans( float [][] data){
         int i=data.length;
         int j=data[ 0 ].length;
         float [][] data2= new float [j][i];
         for ( int k2= 0 ;k2<j;k2++){
             for ( int k1= 0 ;k1<i;k1++){
                 data2[k2][k1]=data[k1][k2];
             }
         }
         
         /*将矩阵转置便可得到伴随矩阵*/
         return data2;
         
     }
     
     
     
     /*求矩阵的逆,输入参数为原矩阵*/
     private static float [][] inv( float [][] data){
         int M=data.length;
         int N=data[ 0 ].length;
         float data2[][]= new float [M][N];
         float det_val=cal_det(data);
         data2=ajoint(data);
         for ( int i= 0 ;i<M;i++){
             for ( int j= 0 ;j<N;j++){
                 data2[i][j]=data2[i][j]/det_val;
             }
         }
         
         return data2;
     }
     /*矩阵加法*/
     private static float [][] matrix_add( float [][] data1, float [][] data2){
         int M=data1.length;
         int N=data1[ 0 ].length;
         float data[][]= new float [M][N];
         for ( int i= 0 ;i<M;i++){
             for ( int j= 0 ;j<N;j++){
                 data[i][j]=data1[i][j]+data2[i][j];
             }
         }
         return data;
     }
     /*矩阵相乘*/
     private static float [][] multiply( float [][] data1, float [][] data2){
         int M=data1.length;
         int N=data1[ 0 ].length;
         int K=data2[ 0 ].length;
         float [][] data3= new float [M][K];
         for ( int i= 0 ;i<M;i++){
             for ( int j= 0 ;j<K;j++){
                 for ( int k= 0 ;k<N;k++){
                     data3[i][j]+=data1[i][k]*data2[k][j];
                 }
             }
         }
         return data3;
     }
     /*输入参数为原矩阵和一个整数,该整数代表从对角线往上或往下平移的元素个数*/
     private static float [][] find_upper( float [][] data, int k){
         int length=data.length;
         int M=length-k;
         float [][] data2= new float [length][length];
         if (k>= 0 ){
             for ( int i= 0 ;i<M;i++){
                 for ( int j=k;j<length;j++){
                     data2[i][j]=data[i][j];
                 }
                 k+= 1 ;
             }
         }
         else {
             for ( int i= 0 ;i<-k;i++){
                 for ( int j= 0 ;j<length;j++){
                     data2[i][j]=data[i][j];
                 }
             }
             for ( int i=-k;i<length;i++){
                 for ( int j=i+k;j<length;j++){
                     data2[i][j]=data[i][j];
                 }
             }
         }
         return data2;
     }
     /*m*n矩阵与n维向量的乘法*/
     private static float [] multiply2( float [][] data1, float [] data2){
         int M=data1.length;
         int N=data1[ 0 ].length;
         float [] data3= new float [M];
         for ( int k= 0 ;k<M;k++){
                 for ( int j= 0 ;j<N;j++){
                     data3[k]+=data1[k][j]*data2[j];
                 }
         }
         return data3;
     }
     /*向量加法*/
     private static float [] matrix_add2( float [] data1, float [] data2){
         int M=data1.length;
         float data[]= new float [M];
         for ( int i= 0 ;i<M;i++){
                 data[i]=data1[i]+data2[i];
         }
         return data;
     }
     /*求两向量之差的二范数(用于检验误差)*/
     private static double cal_error( float [] X1, float [] X2){
         int M=X1.length;
         double temp= 0 ;
         for ( int i= 0 ;i<M;i++){
             temp+=Math.pow((X1[i]-X2[i]), 2 );
         }
         temp=Math.sqrt(temp);
         return temp;
     }
     /*求矩阵的对角矩阵*/
     private static float [][] find_diagnal( float A[][]) {
         int m = A.length;
         int n = A[ 0 ].length;
         float B[][] = new float [m][n];
         for ( int i = 0 ; i < m; i++) {
             for ( int j = 0 ; j < n; j++) {
                 if (i == j) {
                     B[i][j] = A[i][j];
                 }
             }
         }
         return B;
 
     }
     /*高斯赛德尔迭代法*/
     private static float [] Gauss_Seidel_method( float [][] A, float [] B, float [] X){
         float D[][]=find_diagnal(A);
         float L[][]=find_lower(A, - 1 );
         float U[][]=find_upper(A, 1 );
         float temp1[][]=inv(matrix_add(D, L));
         float temp2[][]=opposite_matrix(temp1);
         float B0[][]=multiply(temp2, U);
         float F[]=multiply2(temp1, B);
         
         return matrix_add2(multiply2(B0, X), F);
     
         
     }
     
     public static void main(String[] args) {
         System.out.println( "输入系数矩阵的行和列数:" );
         Scanner scan= new Scanner(System.in);
         int M=scan.nextInt();
         System.out.println( "输入方程组右侧方程值的维度:" );
         int K=scan.nextInt();
         if (M!=K){
             System.out.println( "方程组个数和未知数个数不等!" );
             System.exit( 0 );
         }
         
         System.out.println( "输入系数矩阵:" );
         float [][] A= new float [M][M];
         for ( int i= 0 ;i<M;i++){
             for ( int j= 0 ;j<M;j++){
                 A[i][j]=scan.nextFloat();
             }
         }
         
         System.out.println( "输入值向量" );
         float [] B= new float [M];
         for ( int i= 0 ;i<M;i++){
             B[i]=scan.nextFloat();
         }
         
         System.out.println( "输入初始迭代向量:" );
         float [] X= new float [M];
         for ( int i= 0 ;i<M;i++){
             X[i]=scan.nextFloat();
         }
         
         System.out.println( "输入误差限:" );
         float er=scan.nextFloat();
         float temp[]= new float [M];
         while (cal_error((temp=Gauss_Seidel_method(A, B, X)), X)>=er){
             X=temp;
         }
//      while(cal_error((temp=Gauss_Seidel_method(A, B, X)), X)>=er){
//          X=temp;
//         
//      }
         X=temp;
         System.out.println( "高斯赛德尔计算得到的解向量为:" );
         for ( int i= 0 ;i<M;i++){
             System.out.println(X[i]+ " " );
         }
         System.out.println();
 
     }
 
}
原文:http://www.oschina.net/code/snippet_574827_39084
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java实现高斯赛德尔算法解线性方程组 的相关文章

  • java.lang.VerifyError:JVMVRFY012堆栈形状不一致;

    在 WAS 8 5 5 中部署 Maven 项目时出现以下错误 我在WAS中安装了JDK 1 6和1 7 错误500 org springframework web util NestedServletException 处理程序处理失败
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • 从文本文件中读取阿拉伯字符

    我完成了一个项目 在该项目中我读取了用记事本编写的文本文件 我的文本文件中的字符是阿拉伯语 文件编码类型是UTF 8 当在 Netbeans 7 0 1 中启动我的项目时 一切似乎都正常 但是当我将项目构建为 jar 文件时 字符以这种方式
  • 在 Java 正则表达式中获取多个模式的重叠匹配

    我有同样的问题这个链接 https stackoverflow com questions 18751486 matching one string multiple times using regex in java 但有多种模式 我的正
  • 如何在url请求中发送数组

    我的要求如下 我想给出演员姓名 开始日期 结束日期并获取他在该时期出演的所有电影 因此 我的服务请求是这样的 http localhost 8080 MovieDB GetJson name Actor startDate 20120101
  • 最快的高斯模糊实现

    如何以最快的速度实施高斯模糊 http en wikipedia org wiki Gaussian blur算法 我要用Java来实现它 所以GPU http en wikipedia org wiki Graphics processi
  • Java 卡布局。多张卡中的一个组件

    一个组件 例如JLabel 在多张卡中使用CardLayout 目前看来该组件仅出现在它添加到的最后一张卡上 如果有办法做到这一点 我应该吗 这是不好的做法吗 或者有其他选择吗 你是对的 它只出现在 添加到的最后一张卡 中 但这与CardL
  • 使用 Spring 控制器处理错误 404

    I use ExceptionHandler处理我的网络应用程序抛出的异常 在我的例子中我的应用程序返回JSON回应HTTP status用于对客户端的错误响应 但是 我正在尝试弄清楚如何处理error 404返回与处理的类似的 JSON
  • 在带有 Protocol Buffers 的项目中使用 Proguard 有什么特点?

    我有一个使用 Google Protocol Buffers 的项目 一旦我尝试用 ProGuard 对其进行混淆 似乎 protobuf 会导致问题 我将所有自己的类打包成mybuildedclasses jar 谷歌代码被打包成prot
  • 在 java 中运行外部应用程序但不要等待它完成

    我正在用java编写一个应用程序 允许我运行其他应用程序 为此 我使用了 Process 类对象 但当我这样做时 应用程序会等待进程结束 然后再退出 有没有办法在 Java 中运行外部应用程序 但不等待它完成 public static v
  • 如何从字符串中解析一个大整数? [复制]

    这个问题在这里已经有答案了 我有一个这样的方法 Integer parseInt myInt 不是这个整数变得很长 我得到以下异常 java lang NumberFormatException For input string 40001
  • 如何在不反编译的情况下更改已编译的.class文件?

    我想更改 class 文件方法 我安装 JD Eclipse Decompiler 并打开 class 文件 我添加了一些代码并保存 class 文件 但是 class 文件没有改变 我不知道如何使用反编译器 如果可能的话 如何在不使用反编
  • 如何减去两个 XmlGregorianCalendar 对象来创建一个 Duration 对象?

    我想计算两个时间之间的差值XmlGregorianCalendar对象 从而创建一个Duration object 但我还没有找到执行减法的干净方法 你会怎么做 那应该是 DatatypeFactory newDuration xgc2 t
  • 如何制作一个makefile只用于编译一些java文件?

    我有三个java文件 名为A java B java C java A将创建对象B B将创建对象C 但我以前从未构建过makefile 有谁可以帮我构建一个 makefile 来编译这三个 java 文件吗 我应该使用什么工具来制作 mak
  • 如何从 JavaFX 中的另一个控制器类访问 UI 元素?

    我有一个使用 NetBeans 8 编写的 JavaFX Java 8 应用程序 没有SceneBuilder 我的应用程序有一个主窗口 该窗口有自己的 FXML 文件 primary fxml 和自己的控制器类 FXMLPrimaryCo
  • Collections.sort(list) 和 list.sort(Comparator) 之间的区别

    有什么理由让我应该选择Collections sort list 方法而不是简单地调用list sort 内部Collections sort只是调用sort的方法List无论如何 上课 令人惊讶的是几乎每个人都告诉我使用Collectio
  • 让 Hibernate 和 SQL Server 与 VARCHAR 和 NVARCHAR 良好配合

    我目前正在大型数据库的某些表中启用 UTF 8 字符 这些表已经是 MS SQL 类型 NVARCHAR 此外 我还有几个使用 VARCHAR 的字段 Hibernate 与 JDBC 驱动程序的交互存在一个众所周知的问题 例如 参见在 h
  • spring data jpa复合键重复键记录插入导致更新

    我有一个具有复合键的实体 我试图通过使用 spring data jpa 存储库到 mysql 数据库来持久化它 如下所示 Embeddable public class MobileVerificationKey implements S
  • Java/MongoDB 按日期查询

    我将一个值作为 java util Date 存储在我的集合中 但是当我查询以获取两个特定日期之间的值时 我最终得到的值超出了范围 这是我的代码 插入 BasicDBObject object new BasicDBObject objec
  • Java中单例的其他方式[重复]

    这个问题在这里已经有答案了 只是我在考虑编写单例类的其他方法 那么这个类是否被认为是单例类呢 public class MyClass static Myclass myclass static myclass new MyClass pr

随机推荐

  • golang 读取文件最后一行_测试用例是开发人员最后一块遮羞布

    最近一周写一个比较复杂的业务模块 越写到后面真心越心虚 操作越来越复杂了 代码也逐渐凌乱了起来 比如一个接口 传入的是一个比较复杂的大json 我需要解析这个大json 然后根据json中字段进行增删改查 调用第三方服务等操作 告诉前端接口
  • 微信支付配置流程

    微信支付配置流程 1 微信支付配置 微信公众号平台 gt 如果没有正式域名就要在安全中心配置白名单IP 2 微信公众号 微信公众号设置 gt 在功能设置里面的网页授权域名 3 商户号 产品中心 gt 开发配置 gt 配置jsApi支付页面的
  • vue3中a-table表格默认选中禁止选择

    效果 代码 使用row selection中的getCheckboxProps属性 其中preserveSelectedRowKeys属性设置为true 是为了表格切换页的时候 保留其他页面选中的数据 点击按钮 出现弹窗 const add
  • 深度学习:图像增强

    https blog csdn net zhangjunhit article details 79554140
  • Unity 使Text文本内容配合音频逐个显示并动态设置富文本

    在做一个项目时 需要Text文本内容逐个显示 并且配合音频的播放速度 当音频结束时 文本也显示完毕 而且给每一段文本设置不同的颜色和字号 代码如下 using System Collections using System Collecti
  • jenkins exec command 命令不执行

    本文记述的exec command 命令不执行情况是因为用户权限导致的 根据结果反馈就好像该设置不存在一样但是也没有报错 情况1 前端项目linux截图如下 图中1标志为jenkins所打的包 但是2标志是root账号的dist文件 因权限
  • plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致

    plsql 登录后提示 Database character set AL32UTF8 and Client character set ZHS16GBK are different Character set conversion may
  • Qt信号槽连接方式源码解读

    前言 Qt的五 四 种连接方式 在上一篇已经讲明 本篇主要分析在源码上是如何实现这几种连接方式的 本次源码为Qt 5 15 2 搞懂务必认真阅读最后添加注释后的代码 connect时会做什么 已知connect是可以实现一个信号连接多个槽的
  • ORT执行推理如何指定device编号

    法1 在执行推理前运行命令指定卡号 如 export CUDA VISIBLE DEVICES 1 python test py ox resnet50 16 fp32 说明 编号从0开始 通过上面的方式指定后 推理任务会在第2张卡中运行
  • window 服务器不稳定,服务器Windows系统突发情况的解决办法

    服务器Windows系统现在还是大部分的站长的选择 有很多用户是使用Windows作为网站服务器的系统 今天小编对于服务器Windows系统在维护过程中出现的几种突发情况 来讲讲解决办法 1 终端协议错误 如果用记事本或其他编辑器在远程终端
  • lambda 函数完美使用指南

    来源 萝卜大杂烩 今天我们来学习 Python 中的 lambda 函数 并探讨使用它的优点和局限性 什么是 Python 中的 Lambda 函数 lambda 函数是一个匿名函数 即 没有名称定义 它可以接受任意数量的参数 但与普通函数
  • 浅拷贝和深拷贝的区别

    浅拷贝 Shallow Copy 和深拷贝 Deep Copy 是两种复制对象的方式 它们之间的主要区别在于复制过程中是否会复制对象内部的引用类型数据 浅拷贝 Shallow Copy 浅拷贝仅复制了对象本身以及对象内部的基本数据类型 如i
  • 医学图像2D/3D可视化 ITK-SNAP软件使用

    软件下载链接 ITK SNAP Home 1 导入医学图像 nii gz文件 File gt Open Main Image 点击 Browse 切记不能有中文路径 gt Next 2 载入相应的分割图数据 nii gz文件 Segment
  • Android学习笔记——归纳整理

    目录 一 Android系统架构 二 Actvity相关 2 1基础相关 2 2 Intent相关 2 2 1 Intent的组成 2 2 2 显式Intent 2 2 3 隐式Intent 2 2 4 Intent属性 2 2 5 Int
  • Spring 单元测试中如何进行 mock

    我们在使用 Spring 开发项目时 都会用到依赖注入 如果程序依赖了外部系统或者不可控组件 比如依赖数据库 网络通信 文件系统等 我们在编写单元测试时 并不需要实际对外部系统进行操作 这时就要将被测试代码与外部系统进行解耦 而这种解耦方法
  • objects365数据集下载

    链接 https pan baidu com s 1QiWm8hCJus3LstZkz6Mzdw 提取码 wmrx
  • MySQL的索引和事务

    一 索引 一 索引概念 索引是一种特殊的文件 包含数据库中所有记录的引用 可以对表中的一列或多列创建索引 并指定索引的类型 存储引擎 每种索引在不同的存储引擎中的实现都有可能不同 索引类似数组的下标 通过下标拿到数组中的数据是很快的 同样通
  • 字符串右移n位

    题目 实现字符串右移几位 即 abcd 移两位变 cdab 思路 申请一个与待移位同样大小的数组 用来保存移位后的字符串 通过公式计算出简化的移位数 得到某字符移位后的新位置后 就将其字符值存放到新数组的对应位置 循环第3步 直至检测到字符
  • 【JVM】JVM基础知识:常量池、类加载、JVM内存模型、对象的创建过程

    前言 讲一下大概的内容 类加载 JVM内存模型 对象的创建 垃圾回收 JVM调优 入门 最近抽了时间学了一直都很想学的 JVM 之前也学过一点 也发布过一些零散的文章 但这篇文章会更加全面 学完这篇文章就足以应对有关 JVM 的面试 如果遇
  • java实现高斯赛德尔算法解线性方程组

    package linear equation import java util Scanner 使用高斯赛德尔迭代法求解线性方程组 public class Gauss Seidel Iterate 求下三角 private static