Java优化的Cramers规则函数

2024-03-07

最近了解了初级微积分中的 Cramers 规则,并决定用 Java 制作一个算法来帮助我更好地理解它。

以下代码 100% 正确运行,但是它不使用任何类型的 for 循环来以更简单的方式执行其操作。

问题:Java 中是否有更优雅的 Cramers Rule 实现?

我正在考虑制定一个基本的行列式方法,然后在需要获取 Dx、Dy 和 Dz 的行列式时进行一些列交换。 (对于 Dx,将原始矩阵的第 4 列与第 1 列交换,然后取行列式并除以原始行列式。) 这听起来不错吗?

    public static void main(String[] args) {
    int[][] matrix = new int[3][3];
    matrix[0] = new int[] { 3, 5, -1, -2 };
    matrix[1] = new int[] { 1, -4, 2, 13 };
    matrix[2] = new int[] { 2, 4, 3, 1 };
    int[] r = crame(matrix);    
    info("x: " + r[0] + ", y: " + r[1] + ", z: " + r[2]);
    for(int i = 0; i < matrix.length; i++) {
        int[] base = matrix[i];
        if(check(base, r, base[3])) {
            info("System " + (i+1) + " checks!");
        } else {
            info("System " + (i+1) + " fails check!");
        }
    }
}

public static int[] crame(int[][] m) {
    int[] result;
    if (m.length == 2) {
        result = new int[2];
        int D = (m[0][0] * m[1][1]) - (m[1][0] * m[0][1]);
        int Dx = (m[0][2] * m[1][1]) - (m[1][2] * m[0][1]);
        int Dy = (m[0][0] * m[1][2]) - (m[1][0] * m[0][2]);
        result[0] = (int) (Dx / D);
        result[1] = (int) (Dy / D);
    } else if (m.length == 3) {
        result = new int[3];

        int D = (((m[0][2] * m[1][1] * m[0][2]) + (m[2][1] * m[1][2] * m[0][0]) + (m[2][2]
                * m[1][0] * m[0][2])) - ((m[0][0] * m[1][1] * m[2][2])
                + (m[0][1] * m[1][2] * m[0][2]) + (m[0][2] * m[1][0] * m[2][1])));

        int Dx = (((m[2][3] * m[1][1] * m[0][2]) + (m[2][1] * m[1][2] * m[0][3]) + (m[2][2]
                * m[1][3] * m[0][1])) - ((m[0][3] * m[1][1] * m[2][2])
                + (m[0][1] * m[1][2] * m[2][3]) + (m[0][2] * m[1][3] * m[2][1])));

        int Dy = (((m[2][0] * m[1][3] * m[0][2]) + (m[2][3] * m[1][2] * m[0][3]) + (m[2][2]
                * m[1][0] * m[0][3])) - ((m[0][0] * m[1][3] * m[2][2])
                + (m[0][3] * m[1][2] * m[2][0]) + (m[0][2] * m[1][0] * m[2][3])));

        int Dz = (((m[2][0] * m[1][1] * m[0][3]) + (m[2][1] * m[1][3] * m[0][0]) + (m[2][3]
                * m[1][0] * m[0][1])) - ((m[0][0] * m[1][1] * m[2][3])
                + (m[0][1] * m[1][3] * m[2][0]) + (m[0][3] * m[1][0] * m[2][1])));

        result[0] = (int) (Dx / D);
        result[1] = (int) (Dy / D);
        result[2] = (int) (Dz / D);
    } else {
        return new int[] {};
    }
    return result;
}

public static int product(int[] a, int[] b) {
    int p = 0;
    int[] fin = new int[(a.length -1)];
    for(int x = 0; x < fin.length; x++) {
        fin[x] = a[x] * b[x];
    }
    for (int f : fin) {
            p += f;
    }
    return p;
}

public static boolean check(int[] a, int[] b, int z) {
    return product(a, b) == z;
}

public static void info(String log) {
    System.out.println(log);
}

我的问题涉及仅使用克拉默规则求解方程组的特定算法,是否有更优雅的算法?该函数仅针对方阵设计。

这不是家庭作业,高中毕业后我将学习计算机科学,并且我一直致力于开发算法作为初步实践。

感谢您查看此内容


首先,克拉默规则在一个方面是完美的:它将线性系统的代数解作为其系数的有理函数给出。

然而,实际上,它有其局限性。虽然对于 2x2 系统来说是最完美的公式,并且对于 3x3 系统来说仍然很好,但如果以简单的方式实现,其性能会随着每增加一个维度而恶化。

An almost literal implementation of Cramers rule can be achieved with the Leverrier-Faddeev algorithm a http://www.mathworks.com/matlabcentral/fileexchange/15974-faddeev-leverrier-algorithm/content/html/fadlevexample.html b https://de.wikipedia.org/wiki/Algorithmus_von_Faddejew-Leverrier. It only requires the computation of matrix products and matrix traces, and manipulations of the matrix diagonal. Not only does it compute the determinant of the matrix A (along with the other coefficients of the characteristic polynomial), it also has the adjugate https://en.wikipedia.org/wiki/Adjugate_matrix or co-factor matrix A# in its iteration matrix. The interesting fact about this matrix is that it allows to write the solution of A*x=b as (A#*b)/det(A), that is, the entries of A#*b already are the other determinants required by Cramers rule.

Leverrier-Faddeev requires n4+O(n3) operations. The same results can be obtained by the more complicated Samuelson-Berkowitz https://de.wikipedia.org/wiki/Algorithmus_von_Samuelson-Berkowitz algorith, which has one third of that complexity, that is n4/3+O(n3).

如果首先将系统 (A|b) 转换为三角形形式,则克拉默规则所需的行列式计算将变得非常微不足道。这可以通过 Gauß 消去法,又名 LU 分解(通过旋转实现数值稳定性)或 QR 分解(最容易调试的应该是吉文斯旋转的变体)来实现。克拉默规则的有效应用就是三角系统中的后向替换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java优化的Cramers规则函数 的相关文章

随机推荐

  • REST API 中基于令牌的身份验证

    我尝试实现基于令牌的身份验证方法 每次成功登录都会创建新的令牌 如果用户选择 保持登录状态 或者用户使用移动设备 则令牌将保留在 Redis 数据库中 并且没有过期日期 否则 令牌将在 20 分钟后过期 一旦用户通过身份验证 就会从 Red
  • TAdoQuery.ParseSql 在 xe4 中不起作用

    我有一个 Delphi 7 项目 我使用TAdoQuery ParseSql 加载参数 现在我在XE4中编译它 参数类型有时是错误的 是真的ftInteger但创建为ftSmallint 我可以做什么来解决这个问题 我的数据库是SQL Se
  • 如何使用 Interface Builder 在固定高度的页眉和页脚之间拉伸和锚定中心视图?

    我有一个 UIView 它有 3 个子视图 标题 中心面板和页脚 页眉和页脚都是固定高度的 我可以设置它们的自动调整大小属性 以便它们的行为符合我的要求 页眉保持固定在顶部并拉伸以适合屏幕 纵向或横向 而页脚保持不变固定在底部并随屏幕延伸
  • 如何获取Android上的文件路径?

    我是android菜鸟 我的问题是如何获取android中文件的真实路径 我正在使用意图选择文件 代码如下 Intent intent new Intent intent setType intent setAction Intent AC
  • Dockerfile Raspberry PI Python pip install “PermissionError: [Errno 1] 不允许操作”

    给定 Dockerfile FROM python 3 10 slim RUN pip install user no cache dir Flask requests WORKDIR app COPY app app CMD python
  • Visual Studio 更新 (16.8.1) 导致 CI​​ 构建失败

    我们最近将构建服务器更新为使用 Visual Studio 16 8 1 和 Xamarin iOS 14 4 1 3 并且遇到了以前运行的 MSBuild 命令的问题 作为记录 我们正在构建一个 Xamarin Forms 解决方案 并在
  • 可以在使用 Bokeh 的 IPython 笔记本会话中在 output_notebook 和 output_file 之间切换吗?

    我想知道是否可以在同一个 IPython 笔记本中使用 Bokeh 生成静态 HTML 输出和内联图 我目前看到的是 一旦我打电话output notebook or output file myfile html 我被困在使用那种输出方式
  • 如何从并行进程中运行的函数中检索值?

    Multiprocessing 模块对于 Python 初学者来说相当令人困惑 特别是对于那些刚刚从 MATLAB 迁移并因并行计算工具箱而变得懒惰的人 我有以下函数 运行时间约为 80 秒 我想通过使用 Python 的多处理模块来缩短这
  • 如何在 swift 3 中设置共享 URLCache?

    这是我们在 Swift 2 中的代码 Swift 3 版本是什么 我没有看到 setShared 的替代品 let sharedCache NSURLCache NSURLCache memoryCapacity 0 diskCapacit
  • Oauth2 用于授权和身份验证?

    Oauth2可以用于授权 and 验证 据我了解 Oauth2授权用于从提供商 例如 Facebook Google Twitter 等 访问用户信息的消费者应用程序 但是 Oauth2 可以用来吗认证用户 例如 假设我们有一个由本机移动前
  • 终止使用Python的subprocess.Popen()创建的进程[重复]

    这个问题在这里已经有答案了 这是我的想法 首先 我使用 subprocess Popen 创建了一个进程 其次 在一段时间后 我尝试通过 Popen kill 杀死它 import subprocess import os signal i
  • 确定控制台应用程序是从命令行还是从 Powershell 运行

    如何确定控制台应用程序是从 Powershell 运行还是从应用程序内的标准命令行运行 像这样的事情可能比检查窗口标题更可靠 using System using System Diagnostics Process p Process G
  • Cakephp 2.3.x 发送文件并强制下载 mp4 文件

    我正在使用 cakephp 2 3 1 我想强制下载一个 mp4 文件http book cakephp org 2 0 en controllers request response html cake response file htt
  • Protractor:onPrepare 不同的测试套件

    我登录应用程序的 conf js 文件中有 onPrepare 我的理解是每次我运行 1 个或多个测试套件时 它首先执行 onPrepare 中的任何内容 这很棒 因为我在运行测试之前使用 onPrepare 登录到应用程序 问题是 当我运
  • ggplot2中直方图条形的反向填充顺序

    我注意到 使用绘图创建的直方图中填充条形的默认情况是按字母顺序逆序排列 而图例则按字母顺序排列 我有什么办法让两者按字母顺序排序吗 问题在下面的示例图中很明显 额外问题 如何将从左到右的条形顺序从字母顺序更改为递减计数总数 谢谢 df lt
  • 在部分视图中进行不显眼的客户端验证

    我有一个在 jQuery UI 对话框中呈现的部分视图 因为它是动态内容 所以不引人注目的客户端验证不起作用 为了得到它 我必须强制验证器解析表单的内容调用 validator unobtrusive parse 但这不起作用 我的浏览器报
  • SQL 按版本“编号”排序,不同长度的字符串

    我正在尝试创建一个 SQL 查询 该查询将按版本号 例如 1 1 4 5 10 等 对结果进行排序 这是我尝试过的 SELECT FROM Requirements WHERE Requirements Release NOT LIKE O
  • 每周数据的时间序列分解

    我对 R 完全陌生 刚刚开始使用它 我有三年的每周数据 我想将这个时间序列数据分解为趋势 季节性和其他组成部分 我有以下疑问 我应该使用哪个功能 ts or decompose 如何应对闰年的情况 如果我错了请指正 频率是52 提前致谢 我
  • PyQt5 + Python 3:跨线程传递列表、字典作为信号参数

    我正在使用 pyqtSignal 将 python 列表作为参数从工作线程发送到主线程 qt 何时创建作为参数传递的对象的副本 根据 http www embeddeduse com 2013 06 29 copied or not cop
  • Java优化的Cramers规则函数

    最近了解了初级微积分中的 Cramers 规则 并决定用 Java 制作一个算法来帮助我更好地理解它 以下代码 100 正确运行 但是它不使用任何类型的 for 循环来以更简单的方式执行其操作 问题 Java 中是否有更优雅的 Cramer