hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 786|回复: 9

解方程工具equation.exe

[复制链接]

534

主题

534

帖子

1829

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1829
发表于 2024-4-14 21:27:15 | 显示全部楼层 |阅读模式
高次方程求解,三次方程参考范盛金的公式,四次方程采用费拉里降次为两个二次方程,五次方程没有精确的求根公式,采用牛顿迭代法(利用导线逼近0点)进而降次为四次方程,再套用费拉里将次(包含复数解)。
EQUATION.EXE

摘要:
=============================================================================
这是一个专注解方程和方程组的简单工具,帮助那些想快速计算出结果的童鞋们。求解
结果精确到小数点后12位,且支持复根。
=============================================================================

用法:
-----------------------------------------------------------------------------
equation [/O {parameters}]|[/M]|[/R {parameters}]
-----------------------------------------------------------------------------
  /H  显示帮助信息
  /O  求解一元方程
  /M  求解多元方程组
  /R  求解单位复元根
-----------------------------------------------------------------------------

示例:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
equation /O  3 0 5 -6 -9        //求解一元四次方程3x^4+0x^3+5x^2-6x-9=0
The solution of the equation 3x^4+0x^3+5x^2-6x-9=0 is:
┌────────────────────────┐
  Imag   root: -0.252438186547+1.696390660707i
               -0.252438186547-1.696390660707i
  Real   root:  1.293411063722
               -0.788534690627
└────────────────────────┘

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
equation /R  5                  //求解5次复元根 x^5-1=0
┌────────────────────────┐
        x[ 1]= 0.309016994375+0.951056516295i
        x[ 2]=-0.809016994375+0.587785252292i
        x[ 3]=-0.809016994375-0.587785252292i
        x[ 4]= 0.309016994375-0.951056516295i
        x[ 5]= 1.000000000000-0.000000000000i
└────────────────────────┘

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
equation /M                     //进入方程组模式

        [Multivariable Equations]   ---Quit using "q"
        {2                      //此处输入方程组个数
        Equation coefficients:
        3 2 5                   //第一个方程式的系数
        6 9 1                   //第二个方程式的系数
        Solution of equations:
        ┌───────────────┐
          x[0]= 2.866666793823
          x[1]=-1.800000071526
        └───────────────┘
        {{q                     //输入q退出该模式

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

equation.c源码(采取POS开源协议,即发布的每个作品都开源):
  1. /*    CONSOLE SOLVING EQUATION TOOLS, COPYRIGHT@2016~2018 BY HAPPY    EQUATION.EXE    VERSION 1.0*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>//定义帮助说明//////////////////////////////////////////////////////#define HELPINFORMATION "\SOLVING EQUATION TOOLS, COPYRIGHT@2016~2018 BY HAPPY, VERSION 1.0\n\-----------------------------------------------------------------\n\equation [/O {parameters}]|[/M]|[/R {parameters}]\n\-----------------------------------------------------------------\n\  /H  Displays help information\n\  /O  Solves the univariate equation\n\  /M  Solving Systems of multivariable Equations\n\  /R  Solve the unit root\n\-----------------------------------------------------------------\n\12/03/2016\n"/////////////////////////////////////////////////////////////////////***************功能函数群***************/void equation_set(int n) {      int i, j, m, r, k=0, t, mark;    float a[11][12];    printf("Equation coefficients:\n");    r=n;      for(j=0; j<n; j++){           for(i=0; i<r+1; i++){               scanf("%f", &a[j][i]);        }        if(a[j][0]!=0){mark=j;}    }    //系数修正    for(j=0; j<n; j++){        if(a[j][0]+a[mark][0] != 0){               for(i=0; i<r+1; i++){                   a[j][i] += a[mark][i];            }        }    }    if(r==n)     {           printf("Solution of equations:\n");        for(t=0; t<n-1; t++)            for(m=0; m<n; m++)                for(j=0; j<n; j++)                    if(j!=m)                         {                          float b= a[j][m]/a[m][m];                        for(i=0; i<n+1; i++)                            a[j][i] -= a[m][i]*b;                                          }         for(j=0; j<n; j++)             {                    a[j][n] /=a[j][j];                    a[j][j] /=a[j][j];         }    }    printf("┌───────────────┐\n");    for(j=0; j<r; j++){           printf("   x[%d]=%15.12f\n", j, a[j][n]);    }    printf("└───────────────┘\n");}void twice(double a, double b, double c){    double x1,x2,den=2*a,delt=b*b-4*a*c;    if(a==0){        if(b==0){            printf("  Not a real equation");        }        else{            printf("  Reduced to once equation\n  Real   root: x=%.12lf",-c/b);        }    }    else{            if(delt>0){            x1=-b/den+sqrt(delt)/den;            x2=-b/den-sqrt(delt)/den;            printf("  Real   root: %15.12lf\n               %15.12lf",x1,x2);        }        else if(delt==0){            printf("  Double root: %15.12lf",-b/den);        }        else if(delt<0){            x1=sqrt(-delt)/den;            printf("  Imag   root: %15.12lf+%.12lfi\n               %15.12lf-%.12lfi",-b/den,x1,-b/den,x1);        }    }}double thice(double a, double b, double c, double d, int gk){    double A=b*b-3*a*c,B=b*c-9*a*d,C=c*c-3*b*d,delta=B*B-4*A*C;    if(A==0 && B==0){        if(gk!=1){printf("  Triple real: %15.12lf",-b/(3*a));}        return -b/(3*a);    }    else if(delta>0){        double Y1=A*b+3*a*(-B+sqrt(delta))/2.0,Y2=A*b+3*a*(-B-sqrt(delta))/2.0;        Y1=(Y1>0)? pow(Y1,1.0/3.0) :-pow(-Y1,1.0/3.0);        Y2=(Y2>0)? pow(Y2,1.0/3.0) :-pow(-Y2,1.0/3.0);        double x1=(-b-Y1-Y2)/(3.0*a);        double prr=(-2*b+Y1+Y2)/(6.0*a),pri=(Y1-Y2)*sqrt(3)/(6.0*a);        if(gk!=1){printf("  First  real: %15.12lf\n  Imag   root: %15.12lf+%.12lfi\n               %15.12lf-%.12lfi",x1,prr,pri,prr,pri);}        return x1;    }    else if(delta==0){        if(gk!=1){printf("  Double real: %15.12lf\n               Other  real: %15.12lf\n",-B/(2.0*A),-b/a+B/A);}        if(-B/(2.0*A) > -b/a+B/A){            return -B/(2.0*A);        }else{            return -b/a+B/A;        }    }    else if(delta<0){        double r=acos((2*A*b-3*a*B)/(2*A*sqrt(A)));            double x1=(-b-2.0*sqrt(A)*cos(r/3.0))/(3.0*a);        double x2=(-b-2*sqrt(A)*cos((r+2*M_PI)/3.0))/(3.0*a);        double x3=(-b-2*sqrt(A)*cos((r+4*M_PI)/3.0))/(3.0*a);        if(gk!=1){printf("  Triple real: %15.12lf\n               %15.12lf\n               %15.12lf",x1,x2,x3);}        double tempv;        if(x1 > x2){            tempv=x1;        }else{            tempv=x2;        }        if(tempv > x3){            return tempv;        }else{            return x3;        }    }}void foice(double a, double b, double c, double d, double e){    double y,f[4],M,N,P;    int i;    b/=a;c/=a;d/=a;e/=a;a=1;    f[0]=8;    f[1]=-4.0*c;    f[2]=-(8.0*e-2.0*b*d);    f[3]=-e*(b*b-4.0*c)-d*d;    y=thice(f[0],f[1],f[2],f[3],1);    M=sqrt(8.0*y+b*b-4.0*c);    N=b*y-d;    if(M==0){        P=sqrt(y*y-e);        twice(2.0,b,2.0*(y+P));        printf("\n");        twice(2.0,b,2.0*(y-P));    }else{        twice(2.0,b+M,2.0*(y+N/M));        printf("\n");        twice(2.0,b-M,2.0*(y-N/M));    }}void fifth(double a, double b, double c, double d, double e, double f){     double r,x,F,F1;     b/=a;c/=a;d/=a;e/=a;f/=a;     a=-1.0;    do    {            x=a;           F=x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f;           F1=5*x*x*x*x+4*b*x*x*x+3*c*x*x+2*d*x+e;           a=x-F/F1;        }    while(fabs(x-a)>=1e-10);    double e1=-f/x,d1=(e1-e)/x,c1=(d1-d)/x,b1=(c1-c)/x;     foice(1.0,b1,c1,d1,e1);    printf ("\n  Iterative  : %15.12lf",x);}/***************业务函数群***************///字符串转等式char* atop(char *s){    if(atof(s)>=0){        char *r=malloc(strlen(s)+strlen("+")+1);        strcpy(r,"+");strcat(r,s);          return r;    }    return s;}//解多元方程组void Multivariable_Equations(){    char str[8];    puts("[Multivariable Equations]   ---Quit using "q"");    while(printf("{"),fgets(str,7,stdin)!=NULL){        char *i=strchr(str,'\n');        if(i!=NULL){*i='\0';}        if (i!=str){            if(!strcmp(str,"q")){break;}            equation_set(atoi(str));        }    }}//解一元高次方程void Univariate_Equation(int argc, char** argv){    if(argc==4){        printf("The solution of the equation %sx%s=0 is: \n",argv[2],atop(argv[3]));        printf("┌────────────────────────┐\n");        if(atof(argv[2])==0){printf("  Not a real equation");}else{printf("  %15.12lf",-atof(argv[3])/atof(argv[2]));}         printf("\n└────────────────────────┘");    }    else if(argc==5){        printf("The solution of the equation %sx^2%sx%s=0 is: \n",argv[2],atop(argv[3]),atop(argv[4]));        printf("┌────────────────────────┐\n");        twice(atof(argv[2]),atof(argv[3]),atof(argv[4]));        printf("\n└────────────────────────┘");    }    else if(argc==6){        printf("The solution of the equation %sx^3%sx^2%sx%s=0 is: \n",argv[2],atop(argv[3]),atop(argv[4]),atop(argv[5]));        printf("┌────────────────────────┐\n");        if(atof(argv[2])==0){            printf("  Reduced to a quadratic equation\n");            twice(atof(argv[3]),atof(argv[4]),atof(argv[5]));        }        else{            thice(atof(argv[2]),atof(argv[3]),atof(argv[4]),atof(argv[5]),0);        }        printf("\n└────────────────────────┘");    }    else if(argc==7){        printf("The solution of the equation %sx^4%sx^3%sx^2%sx%s=0 is: \n",argv[2],atop(argv[3]),atop(argv[4]),atop(argv[5]),atop(argv[6]));        printf("┌────────────────────────┐\n");        if(atof(argv[2])==0){            printf("  Reduced to cubic equation\n");            if(atof(argv[3])==0){                printf("  Reduced to a quadratic equation\n");                twice(atof(argv[4]),atof(argv[5]),atof(argv[6]));            }else{                thice(atof(argv[3]),atof(argv[4]),atof(argv[5]),atof(argv[6]),0);            }        }        else{            foice(atof(argv[2]),atof(argv[3]),atof(argv[4]),atof(argv[5]),atof(argv[6]));        }        printf("\n└────────────────────────┘");    }    else if(argc==8){        printf("The solution of the equation %sx^5%sx^4%sx^3%sx^2%sx%s=0 is: \n",argv[2],atop(argv[3]),atop(argv[4]),atop(argv[5]),atop(argv[6]),atop(argv[7]));        printf("┌────────────────────────┐\n");        if(atof(argv[2])==0){            printf("  Reduced to foice equation\n");            if(atof(argv[3])==0){                printf("  Reduced to cubic equation\n");                if(atof(argv[4])==0){                    printf("  Reduced to a quadratic equation\n");                    twice(atof(argv[5]),atof(argv[6]),atof(argv[7]));                }else{                    thice(atof(argv[4]),atof(argv[5]),atof(argv[6]),atof(argv[7]),0);                }                            }else{                foice(atof(argv[3]),atof(argv[4]),atof(argv[5]),atof(argv[6]),atof(argv[7]));            }        }else{            fifth(atof(argv[2]),atof(argv[3]),atof(argv[4]),atof(argv[5]),atof(argv[6]),atof(argv[7]));        }        printf("\n└────────────────────────┘");    }}//单位元根void Unit_Root(int argc, char** argv){    if(argc!=3){        printf("Missing parameters\n");                exit(1);        }    int i, n=atoi(argv[2]);    printf("┌──────────────────────┐\n");    for(i=1; i<n; i++){        if(i==n){printf("     r[%2d]=%15.12lf%.12lfi",i,cos(2*i*M_PI/n),sin(2*i*M_PI/n));break;}        if(sin(2*i*M_PI/n)<0){            printf("     r[%2d]=%15.12lf%.12lfi\n",i,cos(2*i*M_PI/n),sin(2*i*M_PI/n));        }        else{            printf("     r[%2d]=%15.12lf+%.12lfi\n",i,cos(2*i*M_PI/n),sin(2*i*M_PI/n));        }        }    printf("     r[%2d]= 1.000000000000", n);    printf("\n└──────────────────────┘");}/*************MAIN主函数入口*************/int main(int argc, char** argv){    if( (argc >1) && (argv[1][0]=='/') )    {        switch(argv[1][1])        {            case 'H':            case 'h':                fputs(HELPINFORMATION,stdout);                exit(0);            case 'M':            case 'm':                Multivariable_Equations();                break;            case 'O':            case 'o':                Univariate_Equation(argc, argv);                break;            case 'R':            case 'r':                Unit_Root(argc, argv);                break;            default:                fputs(HELPINFORMATION,stdout);                exit(1);        }        return 0;    }    fputs(HELPINFORMATION,stdout);    exit(1);}
复制代码
回复

使用道具 举报

0

主题

186

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-4-14 21:27:38 | 显示全部楼层
我win732位系统,运行你的程序一闪就没了!
回复

使用道具 举报

0

主题

166

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-4-14 21:28:29 | 显示全部楼层
命令行程序,跟之前的计算器用法一样。
在cmd窗口输入equation /O  3 0 5 -6 -9
我的程序都是在一天之内写的,不可能有太多时间去写界面,所以都是命令行程序。就像你用的dir命令一样。
命令行具有启动快,速度快,内存占用小的优点。
回复

使用道具 举报

0

主题

190

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2024-4-14 21:28:49 | 显示全部楼层
打开cmd窗口运行成功,用命令行输入对打字速度要求较高。
回复

使用道具 举报

0

主题

188

帖子

170

积分

关内侯

Rank: 2

积分
170
发表于 2024-4-14 21:29:23 | 显示全部楼层
没有啊,直接复制粘贴就能运行,连按键都不需要,命令行的好处就是直接复制粘贴。这些都是批处理算法流中的,都是可以用来批量无人值守,自动计算的,需要批处理或者lua语言的调用。

核心算法都在那了,只需要加个界面就能像你的计算器一样点击运行了,但是写界面我还得花1天时间,就暂时没界面,我现在正在开发自己的高精度算法库,所以时间比较紧。
回复

使用道具 举报

0

主题

167

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-4-14 21:29:28 | 显示全部楼层
高精度算法库,反正切函数的迭代式会推导吗?我不会推导,用的方法速度较慢。
宝宝说:“反三角函数可以以三角函数为基础,使用牛顿迭代法求解。“,但是我不会,你数学很强,知道是怎么回事吗?
回复

使用道具 举报

0

主题

164

帖子

92

积分

关内侯

Rank: 2

积分
92
发表于 2024-4-14 21:30:13 | 显示全部楼层
赞!
比我牛逼
不过我一般都用mathematica解方程!
回复

使用道具 举报

0

主题

186

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-4-14 21:30:54 | 显示全部楼层
mathematica虽好,但是mathematica也是程序啊。而且我发现mathematica在某些情况下给出的解是错误的。而且mathematica不免费。我用的还是旧版本。
回复

使用道具 举报

0

主题

188

帖子

171

积分

关内侯

Rank: 2

积分
171
发表于 2024-4-14 21:31:35 | 显示全部楼层
galois理论仅仅是根塔理论,而且他21岁就为了女人草率的去决斗而丢了性命。他的理论也如同他本人一样,只有在有根式解的前提下奏效。

而我的程序是数值解,就是用浮点复数去表示解,一个实系数高次方程可以没有根式解,但必须复数解。我只是用导线逼近下复数解而已,得出的结果都是浮点复数,而不是根式。所以我完全是用C语言程序设计的思想去做的。

即便是mathmatica也不可能给出复杂高次方程的根式解。
回复

使用道具 举报

0

主题

198

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 2024-4-14 21:32:31 | 显示全部楼层
我觉得先确定根的范围,
然后随机生成数,然后用牛顿迭代法求解方程
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-5-3 21:37 , Processed in 0.066610 second(s), 21 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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