四次函数的根

2023-12-25

我在进行一些高级碰撞检测时遇到了一种情况,需要计算四次函数的根。

我使用法拉利的通用解决方案编写了一个似乎运行良好的函数,如下所示:http://en.wikipedia.org/wiki/Quartic_function#Ferrari.27s_solution http://en.wikipedia.org/wiki/Quartic_function#Ferrari.27s_solution.

这是我的功能:

    private function solveQuartic(A:Number, B:Number, C:Number, D:Number, E:Number):Array{          
        // For paramters: Ax^4 + Bx^3 + Cx^2 + Dx + E
        var solution:Array = new Array(4);

        // Using Ferrari's formula: http://en.wikipedia.org/wiki/Quartic_function#Ferrari.27s_solution
        var Alpha:Number = ((-3 * (B * B)) / (8 * (A * A))) + (C / A);
        var Beta:Number = ((B * B * B) / (8 * A * A * A)) - ((B * C) / (2 * A * A)) + (D / A);          
        var Gamma:Number = ((-3 * B * B * B * B) / (256 * A * A * A * A)) + ((C * B * B) / (16 * A * A * A)) - ((B * D) / (4 * A * A)) + (E / A);

        var P:Number = ((-1 * Alpha * Alpha) / 12) - Gamma; 
        var Q:Number = ((-1 * Alpha * Alpha * Alpha) / 108) + ((Alpha * Gamma) / 3) - ((Beta * Beta) / 8);

        var PreRoot1:Number = ((Q * Q) / 4) + ((P * P * P) / 27);
        var R:ComplexNumber = ComplexNumber.add(new ComplexNumber((-1 * Q) / 2), ComplexNumber.sqrt(new ComplexNumber(PreRoot1)));

        var U:ComplexNumber = ComplexNumber.pow(R, 1/3);

        var preY1:Number = (-5 / 6) * Alpha;
        var RedundantY:ComplexNumber = ComplexNumber.add(new ComplexNumber(preY1), U);

        var Y:ComplexNumber;

        if(U.isZero()){
            var preY2:ComplexNumber = ComplexNumber.pow(new ComplexNumber(Q), 1/3);

            Y = ComplexNumber.subtract(RedundantY, preY2);
        } else{
            var preY3:ComplexNumber = ComplexNumber.multiply(new ComplexNumber(3), U);
            var preY4:ComplexNumber = ComplexNumber.divide(new ComplexNumber(P), preY3);

            Y = ComplexNumber.subtract(RedundantY, preY4);
        }

        var W:ComplexNumber = ComplexNumber.sqrt(ComplexNumber.add(new ComplexNumber(Alpha), ComplexNumber.multiply(new ComplexNumber(2), Y)));

        var Two:ComplexNumber = new ComplexNumber(2);
        var NegativeOne:ComplexNumber = new ComplexNumber(-1);

        var NegativeBOverFourA:ComplexNumber = new ComplexNumber((-1 * B) / (4 * A));
        var NegativeW:ComplexNumber = ComplexNumber.multiply(W, NegativeOne);

        var ThreeAlphaPlusTwoY:ComplexNumber = ComplexNumber.add(new ComplexNumber(3 * Alpha), ComplexNumber.multiply(new ComplexNumber(2), Y));
        var TwoBetaOverW:ComplexNumber = ComplexNumber.divide(new ComplexNumber(2 * Beta), W);

        solution["root1"] = ComplexNumber.add(NegativeBOverFourA, ComplexNumber.divide(ComplexNumber.add(W, ComplexNumber.sqrt(ComplexNumber.multiply(NegativeOne, ComplexNumber.add(ThreeAlphaPlusTwoY, TwoBetaOverW)))), Two));
        solution["root2"] = ComplexNumber.add(NegativeBOverFourA, ComplexNumber.divide(ComplexNumber.subtract(NegativeW, ComplexNumber.sqrt(ComplexNumber.multiply(NegativeOne, ComplexNumber.subtract(ThreeAlphaPlusTwoY, TwoBetaOverW)))), Two));
        solution["root3"] = ComplexNumber.add(NegativeBOverFourA, ComplexNumber.divide(ComplexNumber.subtract(W, ComplexNumber.sqrt(ComplexNumber.multiply(NegativeOne, ComplexNumber.add(ThreeAlphaPlusTwoY, TwoBetaOverW)))), Two));
        solution["root4"] = ComplexNumber.add(NegativeBOverFourA, ComplexNumber.divide(ComplexNumber.add(NegativeW, ComplexNumber.sqrt(ComplexNumber.multiply(NegativeOne, ComplexNumber.subtract(ThreeAlphaPlusTwoY, TwoBetaOverW)))), Two));

        return solution;
    }

唯一的问题是我似乎遇到了一些例外。最值得注意的是,当我有两个实根和两个虚根时。

例如,这个等式: y = 0.9604000000000001x^4 - 5.997600000000001x^3 + 13.951750054511718x^2 - 14.326264455924333x + 5.474214401412618

返回根: 1.7820304835380467 + 0i 1.34041662585388 + 0i 1.3404185025061823 + 0i 1.7820323472855648 + 0i

如果我绘制该特定方程的图表,我可以看到实际根更接近 1.2 和 2.9(大约)。我不能将四个不正确的根视为随机的,因为它们实际上是方程一阶导数的两个根:

y = 3.8416x^3 - 17.9928x^2 + 27.9035001x - 14.326264455924333

请记住,我实际上并不是在寻找我发布的方程的具体根。我的问题是是否有某种特殊情况我没有考虑到。

有任何想法吗?


为了求次数 >= 3 的多项式的根,我总是使用 Jenkins-Traub 得到更好的结果(http://en.wikipedia.org/wiki/Jenkins-Traub_algorithm http://en.wikipedia.org/wiki/Jenkins-Traub_algorithm)而不是显式公式。

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

四次函数的根 的相关文章

  • 为什么 Math.Atan(Math.Tan(x)) != x?

    如果 tan x y 并且 atan y x 为什么 Math Atan Math Tan x x 我正在尝试计算 x 例如 tan 2 x 3 5 so atan tan 2 x 3 atan 5 等等 但我已经尝试过 double d
  • 如何将数学公式转换为Python代码?

    有没有简单的方法可以将数学公式转换为 Python 代码 也许是译者 网络参考 具体的书籍章节 任何东西 对于正则表达式 有诸如Kodos http kodos sourceforge net 和网站 例如pythonregex com h
  • 模行为背后的数学

    Preamble 这个问题与 P RNG 的行为无关rand 它是关于使用均匀分布的两个值的幂对模 介绍 我知道不应该使用模数 将一个值从一个范围转换为另一个范围 例如从 0 到 5 之间的值rand 功能 会有偏差 这里解释了https
  • 使用两个经度/纬度点获取方向(指南针)

    我正在为移动设备开发 指南针 我有以下几点 point 1 current location Latitude 47 2246 Longitude 8 8257 point 2 target location Latitude 50 924
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • 求截头棱锥体/截棱锥体横截面的边长

    如何找到横截面的边长 如图所示 下图 横截面 红色 截头锥体 截棱锥体 我知道顶部和底部的边长 以及底部的高度 截锥体和到横截面的距离 此外我还知道 顶部和底部底座平行 并且顶部和底部的中心 底部底座直接位于彼此之上 比例是线性的 因此只需
  • 为什么 Convert.ToInt32(1.0/0.00004) != (Int32)(1.0/0.00004)

    为什么这段代码http ideone com YRcICG http ideone com YRcICG void Main double a 0 00004 Int32 castToInt Int32 1 0 a Int32 conver
  • Math.random() 解释

    这是一个非常简单的 Java 尽管可能适用于所有编程 问题 Math random 返回 0 到 1 之间的数字 如果我想返回零到百之间的整数 我会这样做 int Math floor Math random 101 在一到一百之间 我会这
  • 轮廓积分算法 C++

    我正在尝试编写一个应用数学程序来计算复平面中的轮廓积分 对于初学者来说 我想为梯形方法编写一个算法 但我有点坚持理解它会是什么样子 毕竟 我们通常将梯形方法视为 2D 图 而这里我们有 f C gt C 所以我们谈论的是 4D 最终我希望用
  • BODMAS系统的加法和减法

    我一直在构建一个简单的公式计算器 但一直被加法和减法困扰 正如您应该知道的 在计算方程时 您遵循优先级算术规则 即括号 顺序 幂函数 除法 乘法 加法和减法 问题是加法和减法具有相同的优先级 因此您可以从左到右阅读 到目前为止 这是我的代码
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 转换 google.maps.Point 中的 (x, y) 像素坐标

    我试图根据我的 x y 像素坐标 当然还有地图选项 例如缩放和中心 找出 LatLng 为了做到这一点 我发布了另一个question https stackoverflow com questions 25219346 how to co
  • 构建协同过滤/推荐系统

    我正在设计一个网站 该网站的概念是根据用户的口味向他们推荐各种商品 即他们评价过的项目 添加到收藏夹列表中的项目等 亚马逊 Movielens 和 Netflix 就是这样的例子 现在 我的问题是 我不知道从哪里开始了解这个系统的数学部分
  • 加速球之间的碰撞检测

    我正在编写一个物理引擎 模拟器 其中包含 3D 太空飞行 行星 恒星引力 船舶推力和相对论效应 到目前为止 一切进展顺利 但是 我需要帮助的一件事是碰撞检测算法的数学 我使用的运动迭代模拟基本上如下 注意 3D 矢量全部大写 For eac
  • 趋势线的最佳拟合曲线

    问题约束 数据集的大小是已知的 但数据本身并不已知 数据集每次增长一个数据点 趋势线一次绘制一个数据点 使用样条 贝塞尔曲线 Graphs 下面的拼贴画显示了具有相当准确的趋势线的数据集 这些图表是 左上 按小时计算 大约有 24 个数据点
  • 如何求两个地点的经纬度距离?

    我有一组位置的纬度和经度 怎么找distance从集合中的一个位置到另一个位置 有公式吗 半正矢公式假定地球是球形的 然而 地球的形状更为复杂 扁球体模型会给出更好的结果 如果需要这样的精度 你应该更好地使用文森特逆公式 See http
  • 如何计算 3D 坐标的线性索引,反之亦然?

    如果我有一个点 x y z 如何找到该点的线性索引 i 我的编号方案是 0 0 0 是 0 1 0 0 是 1 0 1 0 是最大 x 维度 另外 如果我有一个线性坐标 i 我如何找到 x y z 我似乎无法在谷歌上找到这个 所有结果都充满
  • C 中的浮点运算是否具有结合律?

    加法在数学上具有结合律 a b c a b c 在一般情况下 此属性不适用于浮点数 因为它们表示有限精度的值 作为优化的一部分 从 C 程序生成机器代码时 编译器是否允许进行上述替换 C标准中到底在哪里说的 不允许编译器执行 优化 这将导致
  • 我在哪里可以学习游戏物理及其背后的数学基础知识? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在大学学过数学 三角学 微积分 II 但我不知道为什么在游戏物理中使用 tan arctan 等 我
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通

随机推荐

  • 尝试将 yaml 数据转换为结构时输出为空[重复]

    这个问题在这里已经有答案了 我正在尝试将 yaml 数据转换为结构并打印它 我得到的这个程序的输出是空的 package main import fmt gopkg in yaml v2 type example struct variab
  • 当 size < 1 时,geom_sf 大小参数不起作用

    问题 我正在尝试使用 sf 包创建美国州 县的地图 并且geom sf 来自 ggplot2 但我无法得到size多边形边界线宽度的参数geom sf 正确创建细线时size lt 1 e g ggplot sf obj gt geom s
  • 将平面对象数组转换为嵌套对象

    我有以下数组 实际上来自后端服务 const flat Item id a name Root 1 parentId null id b name Root 2 parentId null id c name Root 3 parentId
  • C++ time_t 问题

    我在 C VS 2008 中的日期管理方面遇到问题 根据MSDN 规范 http msdn microsoft com en us library 323b6b3k 28v VS 90 29 aspx time t代表 自 1970 年 1
  • Erlang ping 节点问题

    我在 erlang shell 中做了 1 gt node nonode nohost But 2 gt net adm ping node pang 为什么 什么问题 为什么不打乒乓球 谢谢 你没有启动 Erlang name or sn
  • 使用 k 均值算法进行异常值检测

    我希望你能帮助我解决我的问题 我正在尝试使用 kmeans 算法来检测异常值 首先 我执行算法并选择那些距聚类中心距离较远的对象作为可能的异常值 我不想使用绝对距离 而是想使用相对距离 即对象到聚类中心的绝对距离与聚类中所有对象到其聚类中心
  • 如何检测 scanf() 末尾的空格或换行符?

    我正在编写一个程序 我必须接受来自用户的命令 就像用户可以在其中设置环境变量值的 shell 一样 我遇到的问题是如果用户输入set var var value我需要知道用户输入了一个空格而不仅仅是set并按下 Enter 键 这是一个不同
  • Beanshell 不允许我将 jar 添加到“默认”JRE 类加载器吗?

    我有一个问题豆壳 http www beanshell org manual bshmanual html我在任何地方都找不到答案 我只能通过以下两种方式之一运行 Beanshell 脚本 其中Classpath是在调用Beanshell之
  • 是我的类内装饰器不够 Pythonic 还是 PyCharm 在 lint 警告方面不够智能?

    我想在类中定义一个装饰器 我不想将它定义为一个单独的 独立的函数 因为这个装饰器是专门针对这个类的 我想将相关的方法保留在一起 这个装饰器的目的是检查一些先决条件 特别是成员变量持有的数据库连接 SSH连接等是否仍然可用 如果不是 则不会调
  • imshow(img, cmap=cm.gray) 显示 128 值的白色

    我正在从 MatLab 转向 python 并使用 imshow 函数 我似乎无法理解为什么它不将值 128 显示为灰色 而我选择了 cmap 为灰度 看起来它使用最高 128 和最低值的灰度 我希望它使用 0 255 的灰度 我怎么做 U
  • Objective-C – UILocalNotification AlertBody 长度

    我正在寻找一些文档来找到最大长度alertBody of a UILocalNotification之前它会被剪辑在通知中心 横幅 或弹出警报中 I haven t found any specific limit documented H
  • 我应该使用哪个 HTML5 标签来标记作者姓名?

    例如博客文章或文章
  • 如何将对象从其基类转换为其子类

    我有课User这是类的子类PFUser class User PFUser var isManager false 在我的一种方法中 我收到了PFUser对象 我想将其转换为User object func signUpViewContro
  • tf.zeros() 的动态大小(与无尺寸的占位符一起使用)

    考虑以下代码 x tf placeholder float shape 42 4 y tf zeros 42 4 float xy stacked tf concat 1 x y print x get shape print y get
  • Flutter PDF 中古吉拉特语字体渲染问题

    我正在使用 Flutter 2 0 开发移动应用程序 整个应用程序采用古吉拉特语 应用程序已准备就绪 所有文本都在应用程序中完美呈现 但是当我从屏幕上的数据生成 pdf 时 古吉拉特语字体不正确渲染 我正在使用插件 pdf 3 0 1 fo
  • 指定默认下载文件夹 - 可能使用 JavaScript?

    我们目前正在开发一个基于网络的应用程序 该应用程序需要通过浏览器下载文件 理想的情况是让这些文件最终位于文件系统上的特定位置 有没有办法使文件保存和文件打开对话框默认为特定文件夹 例如 USER Downloads MyApp 我不希望它成
  • Nanoc布局编译规则

    我正在使用nanoc 我希望我的index html指向特定的布局 所以我创建了该布局 它被称为nosidebar html 我的规则如下 compile index html do layout nosidebar end 这似乎不起作用
  • 如何使用 vue-test-utils 打开 bootstrap-vue 模式?

    我使用 bootstrap 作为我的设计框架 并且一直在使用 bootstrap vue 现在我想实现一些测试来配合我的组件 我正在编写一个非常简单的测试来确保打开模式 我在 vue test utils 中使用什么来打开 bootstra
  • Spring security 具有多个登录页面

    我正在使用 Spring security 使用用户名和密码来安全登录应用程序管理部分 但现在我的客户需要为应用程序客户端部分提供另一个登录屏幕 他们将在其中拥有自己的用户名 密码来登录客户端部分 到目前为止 我已经使用以下 spring
  • 四次函数的根

    我在进行一些高级碰撞检测时遇到了一种情况 需要计算四次函数的根 我使用法拉利的通用解决方案编写了一个似乎运行良好的函数 如下所示 http en wikipedia org wiki Quartic function Ferrari 27s