【math】利用Cardano方法对一元三次方程求解及python实现

news2025/8/12 7:42:25

文章目录

    • 【参考】
    • 【问题描述】
      • 求解一元三次方程
    • 【代码实现】
      • 现成的包 cardano_method
      • 根据公式编写求解代码
    • 【总结】

【参考】

  • 用Cardano方法求解三次方程介绍
  • cardano方法求解
  • 下载cardano方法包
  • x^3+1=0求解问题、三次方程反函数问题
  • Micorsoft-Math-solver 微软数学工具
  • WolframAlpha: inverse of a function/反函数
  • 百度百科-一元三次方程求根公式

【问题描述】

求解一元三次方程

求解一元三次方程:
a x 3 + b x 2 + c x + d = 0 ax^3+bx^2+cx+d=0 ax3+bx2+cx+d=0

求解有多种方法,其中Cardano方法得到的解为:
在这里插入图片描述

一元三次多项式: y = f ( x ) = a x 3 + b x 2 + c x + d y=f(x)=ax^3+bx^2+cx+d y=f(x)=ax3+bx2+cx+d => a x 3 + b x 2 + c x + d − y = 0 ax^3+bx^2+cx+d-y=0 ax3+bx2+cx+dy=0

【代码实现】

现成的包 cardano_method

  • 可以使用python包:安装cardano_method 【参考这里】
    pip install cardano_method
    
    该包的使用:CubicEquation函数对应第一个参数列表是:[a, b, c, d],即求解方程的各系数。
    from cardano_method.cubic import CubicEquation
    a = CubicEquation([1, 3, 4, 4])
    print(a.answers)  # j表示虚部后缀
    # [(-2+0j), (-0.5+1.322875j), (-0.5-1.322875j)]
    print(a.answers[0].real)  # 获取第一个解的实部
    print(a.answers[0].imag)  # 获取第一个解的虚部
    
    但是发现一个问题:解方程 x 3 + 1 = 0 x^3+1=0 x3+1=0时,居然报错分母是0:ZeroDivisionError
    a = CubicEquation([1, 0, 0, 1])
    
    在这里插入图片描述
    但实际上, x 3 + 1 = 0 x^3+1=0 x3+1=0的解是对应: x 1 = − 1 x_1=-1 x1=1, x 2 = 1 2 + 3 2 i x_2=\frac{1}{2}+\frac{\sqrt{3}}{2}i x2=21+23 i, x 3 = 1 2 − 3 2 i x_3=\frac{1}{2}-\frac{\sqrt{3}}{2}i x3=2123 i(这里 i i i表示虚数)。需要详细看下包中bug如何解决?

根据公式编写求解代码

  1. 可以根据对应解的公式写出求解函数:【注意:关于浮点型计算有问题?】

    def cardano_solution_v0(a, b, c, d):
        ab = -b/float(3*a)
        q = (3*a*c-(b**2)) / (9*(a**2))
        r = (9*a*b*c-27*(a**2)*d-2*(b**3)) / (54*(a**3))
        delta_sqrt = (q**3+r**2)**(1.0/2)
        
        s = (r+delta_sqrt)**(1.0/3)
        t = (r-delta_sqrt)**(1.0/3)
        imag = complex(0, (s-t)*(3**(1.0/3))/2)
        x1 = s+t+ab
        x2 = -(s+t)/2+ab+imag
        x3 = -(s+t)/2+ab-imag
        return x1, x2, x3
    

    测试修改保留浮点,还是有问题,跟cardano_method包的结果对不上???【注:cardano_solution_v0cardano_solution_v1都有问题,正确的解见下方函数:cardano_solution

    def round_ri(xo, n=4):
        xr, xi = round(xo.real, n), round(xo.imag, n)
        if xi == 0:
            return xr
        else:
            return complex(xr, xi)
    
    def cardano_solution_v1(a, b, c, d):
        ab = -b/float(3*a)
        q = (3*a*c-(b**2)) / (9*(a**2))
        r = (9*a*b*c-27*(a**2)*d-2*(b**3)) / (54*(a**3))
        delta_sqrt = round((q**3+r**2)**(1.0/2), 4)
        
        # print("r, delta_sqrt:", r, delta_sqrt, round(r-delta_sqrt, 4))
        s = round((r+delta_sqrt)**(1.0/3), 8)
        t = round(r-delta_sqrt, 4)**(1.0/3)
        print("st,ab:", s, t, ab)
        imag = complex(0, (s-t)*(3**(1.0/3))/2)
        x1 = s+t+ab
        x2 = -(s+t)/2+ab+imag
        x3 = -(s+t)/2+ab-imag
        return round_ri(x1), round_ri(x2), round_ri(x3)
    

    是公式本身写的有误?还是浮点/开根号问题?需要再检查。。。

  2. 测试其他公式: 百度百科-一元三次方程求根公式

    这里是说,一元三次方程的系数是复数时,用Cardano公式有问题(什么问题?),旧使用如下通用的求根公式:
    在这里插入图片描述在这里插入图片描述

    def cardano_solution(a, b, c, d):
        #u = round((9*a*b*c-27*(a**2)*d-2*(b**3)) / (54*(a**3)), 4)
        #v = round(3*(4*a*c**3 - b**2*c**2-18*a*b*c*d+27*a**2*d**2+4*b**3*d) / (18**2*a**4), 4) ** (1.0/2)
        u = (9*a*b*c-27*(a**2)*d-2*(b**3)) / (54*(a**3))
        v = (3*(4*a*c**3 - b**2*c**2-18*a*b*c*d+27*a**2*d**2+4*b**3*d) / (18**2*a**4)) ** (1.0/2)
        if abs(u+v) >= abs(u-v):
            m = (u+v) ** (1.0/3)
        else:
            m = (u-v) ** (1.0/3)
        if m == 0: 
            n == 0
        else:
            n = (b**2-3*a*c) / (9*a**2*m)
        # w = complex(0, -0.5+(3/4)**(1.0/2))
        # w2 = complex(0, -0.5-(3/4)**(1.0/2))
        w = -0.5+(-3/4)**(1.0/2)
        w2 = -0.5-(-3/4)**(1.0/2)
        ab = -b/float(3*a)
        x1 = m+n+ab
        x2 = w*m+w2*n+ab
        x3 = w2*m+w*n+ab
        # return x1, x2, x3
        return round_ri(x1), round_ri(x2), round_ri(x3)
    

    测试结果cardano_solutioncardano_method包可以对上,且求解 x 3 + 1 = 0 x^3+1=0 x3+1=0 没有问题:

    print(cardano_solution(1,3,4,4))
    print(cardano_solution(1,0,0,-1))
    print(cardano_solution(1,0,0,1))
    # ((-0.5+1.3229j), -2.0, (-0.5-1.3229j))
    # (1.0, (-0.5+0.866j), (-0.5-0.866j))
    # ((0.5+0.866j), -1.0, (0.5-0.866j))
    
    print(CubicEquation([1,3,4,4]).answers)
    print(CubicEquation([1,0,0,-1]).answers)
    print(CubicEquation([1,0,0,1]).answers)  # 报错
    # [(-2+0j), (-0.5+1.322875j), (-0.5-1.322875j)]
    # [(1+0j), (-0.5+0.866025j), (-0.5-0.866025j)]
    # ZeroDivisionError ...
    

【总结】

  • 根据公式自己编写的函数cardano_solution可求解一元三次方程。
  • 下载的包cardano_method和直接使用Cardano公式写的函数有问题。原因是?

附: python 获取复数的实部和虚部。使用j后缀表示虚数,比如a+bj中,a是实部,b是虚部,python中用complex(a,b)生成一个复数。

x = 2+1.5j
print(x.real)  # 打印实部:2
print(x.imag)  # 打印虚部:2
x1 = complex(2,1.5)  # 使用`complex`生成复数 2+1.5j

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Transformers自然语言处理系列教程》第1章:Transformers 介绍

2017年,谷歌的研究人员发表了一篇论文,提出了一种用于序列建模的新型神经网络架构。这种架构被称为Transformer,在机器翻译质量和训练成本方面都优于递归神经网络(RNNs)。 与此同时,一种名为ULMFiT的有效迁移学习方法表明,在一个非常大和多样化的语料库上,训练长短期记…

Kotlin拿Android本地视频缩略图

本文主要讨论如下三个问题: 如何拿到本地视频?怎么拿视频缩略图?缩略图如何压缩? 1 如何拿到本地视频? 1.1 定义数据结构 先定义媒体信息数据结构MediaInfo,以及视频信息数据结构VideoInfo。 open class…

我参加NVIDIA Sky Hackathon 训练文件的路径设置

各变量的作用 KEY 对应的是 NVIDIA ngc 的那个网站上面生成的那个 keyGPU 的索引, 这个一般不需要修改, 因为大家只有一块 GPU用户实验目录, 这个文件夹用于存放后续过程产生的一系列的文件数据下载目录, 存放数据 本地工程目录&a…

Java并发编程实战读书笔记二

第五章 基础构建模块 5.1 同步容器类 5.1.1 同步容器类的问题 如下,如果list含有10个元素,线程A调用getLast的同时线程B调用deleteLast,那么getLast可能会报ArrayIndexOutOfBoundsException 改为如下方式能确保size和get一致 Vector迭代也…

【795. 区间子数组个数】

来源:力扣(LeetCode) 描述: 给你一个整数数组 nums 和两个整数:left 及 right 。找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个数。 生成的测试用例…

微信小程序| 用小程序复刻微信Wechat

📌个人主页:个人主页 ​🧀 推荐专栏:小程序开发成神之路 --【这是一个为想要入门和进阶小程序开发专门开启的精品专栏!从个人到商业的全套开发教程,实打实的干货分享,确定不来看看? …

新的趋势:From Big to Small and Wide data

新的趋势:From Big to Small and Wide data 所以,在这个时候,作为率先提出要做 MySQL 开源 HTAP 数据库的 StoneDB,想要稍微冷静一下。 不是说我们不做 HTAP 了,而是有了一个新的思路。这个思路,也同样来…

【模型训练】YOLOv7车辆三类别检测

YOLOv7车辆三类别检测 1、车辆三类别检测模型训练2、模型评估3、模型和数据集下载网盘链接1、本项目采用YOLOv7算法实现对车辆三类别检测,在几千多张车辆三类别数据集中训练得到,我们训练了YOLOv7、,所有指标都是在同一个验证集上得到; 2、目标类别数:3;类别名:car、bus…

【蓝桥杯选拔赛真题29】python堆砖块 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python堆砖块 一、题目要求 1、提示信息 1、编程实现 2、输入输出

WindowsServer域控的安装与卸载

搭建域服务器 1.安装域控 打开服务器管理器, 点击右上角的管理, 选择添加角色和功能 一直点击下一步,直到选择服务器角色处, 勾选Active Directory域服务器 一直下一步,然后点击安装 安装完毕后将此服务器提升为域控制器 自行设置DSRM的密码, 后面一直点击下一步直…

【优化调度】遗传算法求解公交车调度排班优化问题【含Matlab源码 2212期】

⛄ 一、 遗传算法简介 1 引言 公交排班问题是城市公交调度的核心内容,是公交调度人员、司乘人员进行工作以及公交车辆正常运行的基本依据。行车时刻表是按照线路的当前客流量情况,确定发车频率,提供线路车辆的首、末车时间。它是公交企业对社会的承诺,决定着为乘客服务的水平,…

2023-2028年中国花炮行业市场供需与投资预测分析报告

本报告由锐观咨询重磅推出,对中国花炮行业的发展现状、竞争格局及市场供需形势进行了具体分析,并从行业的政策环境、经济环境、社会环境及技术环境等方面分析行业面临的机遇及挑战。还重点分析了重点企业的经营现状及发展格局,并对未来几年行…

【Java 设计模式】简单工厂模式 静态工厂模式

简单工厂模式 & 静态工厂模式1 简单工厂模式1.1 角色1.2 点咖啡案例1.2.1 类图1.2.2 实现1.3 优点1.4 缺点2 静态工厂模式2.1 代码变动2.2 优点1 简单工厂模式 简单工厂模式并不属于 23 种设计模式。 1.1 角色 抽象产品:定义产品的规范,描述产品的…

相控阵天线(七):常规平面阵列分布(矩形阵列、三角栅格、六边形阵列和圆形阵列)

目录简介矩形栅格平面阵列三角栅格平面阵列六边形阵列圆形平面阵列空心平面阵列简介 常见的平面阵有一些基本类型,按照栅格形式可以进行以下划分:矩形栅格、三角形栅格、同心圆环和椭圆环栅格等;按照边界形式可以进行以下划分:矩…

React Native Webview 中input type=file accept=“image/*“ 无法调起相机问题排查及解决

最近在写一个react native 项目&#xff0c;其中react-native-webview库一些使用着实遇到了不少问题&#xff0c;耗时比较长&#xff0c;现在和大家分享一下。 图片上传时选择拍照是很常见的功能&#xff0c;写的h5项目一直调用正常。使用方式大概如下&#xff1a; <input…

【数据结构】—— 双链表的增删改查

❤️一名热爱Java的大一学生&#xff0c;希望与各位大佬共同学习进步❤️ &#x1f9d1;个人主页&#xff1a;周小末天天开心 各位大佬的点赞&#x1f44d; 收藏⭐ 关注✅&#xff0c;是本人学习的最大动力 感谢&#xff01; &#x1f4d5;该篇文章收录专栏—数据结构 目录 双…

艾美捷小鼠肿瘤坏死因子α-ELISpot试剂盒使用指南

ELISpot Plus for enumeration of cells secreting TNF-α This kit is ideal for users who want a convenient and sensitive assay. The assay is designed for the enumeration of cells secreting mouse TNF-α. The kit includes ELISpot plates pre-coated with monocl…

[附源码]计算机毕业设计JAVA面试刷题系统

[附源码]计算机毕业设计JAVA面试刷题系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

【C++】--模拟实现vector

文章目录Constructors(构造函数)myvector()myvector(int n, const T& val T())myvector(InputIterator first, InputIterator last)拷贝构造交换函数myvector< T >& operator(myvector< T > v)迭代器扩容reserveresize插入和删除push_backpop_backinserte…

CDH启用kerberos 高可用运维实战

一、背景说明 在前的文章中介绍过《CDH集成的kerberos迁移实战》,由此也考虑到kerberos单节点可能引发的线上事故&#xff0c;所有考虑到把线上kerberos服务启用高可用。 二、环境介绍 系统版本 CentOS Linux release 7.6.1810 (Core) CM版本 Kerberos版本 三、实操…