以梦为马,不负韶华

搜索
查看: 3126|回复: 8
收起左侧

以前无聊的时候搞得个东东(二)

[复制链接]
发表于 1970-1-1 08:00:00 显示全部楼层
好有趣的编程。
回复 支持 反对

使用道具 举报

发表于 1970-1-1 08:00:00 显示全部楼层

这东西我收了!谢谢楼主!马后炮化工真好!
[发帖际遇]: wmm598 屌丝逆袭成功,获得白富美女神垂青,赚了 5 个 韶华币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

发表于 1970-1-1 08:00:00 显示全部楼层
回复 支持 反对

使用道具 举报

 成长值: 30025

发表于 1970-1-1 08:00:00 显示全部楼层

这东西我收了!谢谢楼主!马后炮化工真好!
[发帖际遇]: 一个袋子砸在了 wunhua2004 头上,wunhua2004 赚了 2 个 韶华币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

发表于 1970-1-1 08:00:00 显示全部楼层

论坛不能没有像楼主这样的人才啊!我会一直支持马后炮化工
回复 支持 反对

使用道具 举报

发表于 1970-1-1 08:00:00 显示全部楼层

论坛不能没有像楼主这样的人才啊!我会一直支持马后炮化工
[发帖际遇]: acrees 乐于助人,帮助不愿意过马路的老奶奶过马路,奖励 3 个 韶华币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

发表于 2010-4-16 16:46:47 显示全部楼层 |阅读模式
接下来就是要考虑求压缩因子的问题了  因为立方型状态方程为三次的,所以要考虑解三次方程的问题,传统解法为迭代法,矩阵分解法等,太复杂了,网上有个文章介绍了个公式,叫盛金公式,具体原理我搞不太懂,但通过在下的反复试验,得出的解和matlab的一样准确    作者好像叫范盛金,这年头搞基础学科的太少了,个人感觉他是个牛人。
PR方程整理成压缩因子的形式为三次方程   解方程   就可以得出系统的压缩因子

利用盛金公式求方程实根的代码:
public class commenGJ
    {
        //利用盛金公式,计算三次方程的最小实数根,感谢盛金同学
        public static double minSHJ(double a,double b,double c,double d)
        {
            double A = b*b-3*a*c;
            double B = b * c - 9 * a * d;
            double C = c * c - 3 * b * d;
            double dt = B * B - 4 * A * C;
            if (A == B && A == 0d)
            {
                return -c / b;
            }
            else if (dt > 0)
            {
                double Y1 = A * b + 3 * a * (-B + Math.Pow(dt, 0.5d)) / 2;
                double Y2 = A * b + 3 * a * (-B - Math.Pow(dt, 0.5d)) / 2;
                return (-b - Math.Sign(Y1) * Math.Pow(Math.Abs(Y1), 1d / 3) - Math.Sign(Y2) * Math.Pow(Math.Abs(Y2), 1d / 3)) / (3 * a);
            }
            else if (dt == 0)
            {
                double K = B / A;
                return Math.Min(-b / a + K, -K / 2);
            }
            else if (dt < 0)
            {
                double T = (2 * A * b - 3 * a * B) / (2 * Math.Sqrt(A * A * A));
                double st = Math.Acos(T);
                double temp1 = (-b - 2 * Math.Sqrt(A) * Math.Cos(st / 3)) / (3 * a);
                double temp2 = Math.Min((-b + Math.Sqrt(A) * (Math.Cos(st / 3) + Math.Sqrt(3) * Math.Sin(st / 3))) / (3 * a), (-b + Math.Sqrt(A) * (Math.Cos(st / 3) - Math.Sqrt(3) * Math.Sin(st / 3))) / (3 * a));
                return Math.Min(temp1, temp2);
               
            }
            else
                return 0d;
        }
        //利用盛金公式,计算三次方程的最大实数根,感谢盛金同学
        public static double maxSHJ(double a, double b, double c, double d)
        {
            double A = b * b - 3 * a * c;
            double B = b * c - 9 * a * d;
            double C = c * c - 3 * b * d;
            double dt = B * B - 4 * A * C;
            if (A == B && A == 0d)
            {
                return -c / b;
            }
            else if (dt > 0)
            {
                double Y1 = A * b + 3 * a * (-B + Math.Pow(dt, 0.5d)) / 2;
                double Y2 = A * b + 3 * a * (-B - Math.Pow(dt, 0.5d)) / 2;
                return (-b - Math.Sign(Y1) * Math.Pow(Math.Abs(Y1), 1d / 3) - Math.Sign(Y2) * Math.Pow(Math.Abs(Y2), 1d / 3)) / (3 * a);
            }
            else if (dt == 0)
            {
                double K = B / A;
                return Math.Max(-b / a + K, -K / 2);
            }
            else if (dt < 0)
            {
                double T = (2 * A * b - 3 * a * B) / (2 * Math.Sqrt(A * A * A));
                double st = Math.Acos(T);
                double temp1 = (-b - 2 * Math.Sqrt(A) * Math.Cos(st / 3)) / (3 * a);
                double temp2 = Math.Max((-b + Math.Sqrt(A) * (Math.Cos(st / 3) + Math.Sqrt(3) * Math.Sin(st / 3))) / (3 * a), (-b + Math.Sqrt(A) * (Math.Cos(st / 3) - Math.Sqrt(3) * Math.Sin(st / 3))) / (3 * a));
                return Math.Max(temp1, temp2);
            }
            else
                return 0d;
        }

        
    }

写的太仓促,欢迎大家一起讨论 参与
说不准将来远程合作开发个炮网专用的计算软件。
哈哈

评分

参与人数 1韶华币 +10 收起 理由
xaogny + 10

查看全部评分

懒得打字嘛,点击右侧快捷回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|以梦为马,不负韶华

GMT+8, 2025-1-1 18:11

Powered by 以梦为马,不负韶华

© 2024-2099 Meng.Horse

快速回复 返回顶部 返回列表