2497|9

7671

帖子

2

TA的资源

五彩晶圆(高级)

楼主
 

三次方根C++代码 [复制链接]

记录分享一下,很多时候需要处理各种物理模型,免不了涉及各类计算,分享一个三次方根的:

 

https://blog.csdn.net/he_nan/article/details/78069950

 

 

// π
const double PIE = 3.1415926535897932384626433832795;
// 求一个实数的立方根
static double SolveCubicRoot(double value);
// 求一元一次方程的实根:ax+b=0
static std::vector<double> SolveLinearEquation(double a, double b);
// 求一元二次方程的实根:ax^2+bx+c=0
static std::vector<double> SolveQuadraticEquation(double a, double b, double c);

// 求一元三次方程的实根:ax^3+bx^2+cx+d=0
std::vector<double> SolveCubicEquation(double a, double b, double c, double d)
{
    // 判断三次项系数是否为零
    if (a == 0)
    {
        return SolveQuadraticEquation(b, c, d);
    }

    std::vector<double> root;

    // 系数
    double p = (c / a - b * b / (3 * a * a)) / 3;
    double q = (d / a + 2 * b * b * b / (27 * a * a * a) - b * c / (3 * a * a)) / 2;
    double diff = -b / (3 * a);

    // 判别式
    double delta = p * p * p + q * q;
    if (delta > 0)
    {
        // 方程只有一个实根
        double sqrtDelta = sqrt(delta);
        root.push_back(SolveCubicRoot(-q + sqrtDelta) + SolveCubicRoot(-q - sqrtDelta));
    }
    else if (delta < 0)
    {
        // 方程有三个不等的实根
        double angle = acos(-q * sqrt(-p) / (p * p)) / 3;
        root.push_back(2.0 * sqrt(-p) * cos(angle));
        root.push_back(2.0 * sqrt(-p) * cos(angle + 2 * PIE / 3));
        root.push_back(2.0 * sqrt(-p) * cos(angle + 4 * PIE / 3));
    }
    else
    {
        // 方程有三个实根,其中至少有两个相等的实根
        if (q == 0)
        {
            root.push_back(0);
        }
        else
        {
            root.push_back(SolveCubicRoot(q));
            root.push_back(-2 * SolveCubicRoot(q));
        }
    }

    // 将结果加上余量
    for (int i = 0, maxSize = root.size(); i < maxSize; ++i)
    {
        root[i] += diff;
    }

    return root;
}

double SolveCubicRoot(double value)
{
    return value > 0 ? pow(value, 1.0 / 3) : -pow(-value, 1.0 / 3);
}

std::vector<double> SolveLinearEquation(double a, double b)
{
    std::vector<double> root;

    // 判断一次项系数是否为零
    if (a != 0)
    {
        root.push_back(-b / a);
    }

    return root;
}

std::vector<double> SolveQuadraticEquation(double a, double b, double c)
{
    // 判断二次项系数是否为零
    if (a == 0)
    {
        return SolveLinearEquation(b, c);
    }

    std::vector<double> root;

    // 计算判别式
    double delta = b * b - 4 * a * c;
    if (delta > 0)
    {
        // 方程有两个不等的实根
        root.push_back((-b + sqrt(delta)) / (2 * a));
        root.push_back((-b - sqrt(delta)) / (2 * a));
    }
    else if (delta == 0)
    {
        // 方程有两个相等的实根
        root.push_back(-b / (2 * a));
    }

    return root;
}

 

最新回复

去python偷一个   详情 回复 发表于 2022-12-16 09:25
点赞 关注
个人签名

默认摸鱼,再摸鱼。2022、9、28


回复
举报

994

帖子

3

TA的资源

一粒金砂(高级)

沙发
 

这个计算花费多长时间,?

点评

算好了传给下位机。下位机算这个估计得2位数ms  详情 回复 发表于 2022-12-1 18:07
 
 

回复

224

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

用x86/x64跟单片机拼

报告掌门,隔壁csdn砸场子来啦

点评

arm也不错,能顶的  详情 回复 发表于 2022-12-1 18:08
 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

4
 
machinnneee 发表于 2022-11-30 12:51 这个计算花费多长时间,?

算好了传给下位机。下位机算这个估计得2位数ms

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

5
 
starcat123 发表于 2022-12-1 00:39 用x86/x64跟单片机拼 报告掌门,隔壁csdn砸场子来啦

arm也不错,能顶的

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

6
 

建议给出源代码下载,最好有可视化界面的,方便大家使用。

 
 
 

回复

6040

帖子

195

TA的资源

版主

7
 

你这个比标准库快多少?

点评

标准库有三次方根?我没查到呀。队长赶紧po一个。  详情 回复 发表于 2022-12-15 18:58
 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

8
 
lcofjp 发表于 2022-12-14 01:17 你这个比标准库快多少?

标准库有三次方根?我没查到呀。队长赶紧po一个。

点评

去python偷一个  详情 回复 发表于 2022-12-16 09:25
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

6040

帖子

195

TA的资源

版主

9
 
freebsder 发表于 2022-12-15 18:58 标准库有三次方根?我没查到呀。队长赶紧po一个。

去python偷一个

点评

python个鸡毛,不值得一偷。  详情 回复 发表于 2022-12-16 16:44
 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

10
 

python个鸡毛,不值得一偷。

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表