基于C语言使用卡尔丹公式法求解一元三次方程
求根公式的推导
这里直接引用网络上的一般公式 ,如下图。
在C语言中的实现
#include<stdio.h>
#include<math.h>
#include<complex.h>int main() {double _Complex x1,x2,x3,p,q,i,w,s1,s2,s3,X2,X3;//命名为复数double型float a=0.0633,b=0.0616,c=-11.618;//已知参数a、b、c求d
//从data1.txt读数据float d[63]={0}; //数据数目与初始化FILE *fpRead=fopen("data1.txt","r"); if(fpRead==NULL) { return 0; } for(int i=0;i<64;i++) { fscanf(fpRead,"%e ",&d[i]); printf("%f\n",d[i]); p=(3*a*c-b*b)/(3*a*a);q=(27*a*a*d[i]-9*a*b*c+2*b*b*b)/(27*a*a*a);w=-0.5+(sqrt(3)/2)*I;s1=-b/(3*a);s2=cpow((-q/2+csqrt(q*q/4+p*p*p/27)),1.0/3);s3=cpow((-q/2-csqrt(q*q/4+p*p*p/27)),1.0/3);x1=s1+s2+s3;x2=s1+w*s2+w*w*s3;x3=s1+w*w*s2+w*s3;printf("第一个解的实部为%f, 虚部为%f, 模为%f\n", creal(x1), cimag(x1), cabs(x1));printf("第二个解的实部为%f, 虚部为%f, 模为%f\n", creal(x2), cimag(x2), cabs(x2));printf("第三个解的实部为%f, 虚部为%f, 模为%f\n", creal(x3), cimag(x3), cabs(x3));}
}
关于一元三次方程组算法设计的注解:一元三次方程组可能会出现复数根的情况,同时对于本文所选求根公式,里面包含有许多开根号的情况,在算法设计中需要特别注意开根号下面不能为负数,若为负数需要使用复数计算。
关于C语言编写的注解:头文件中使用了math.h为数学公式库,complex.h为复数运算库。内容部分使用输入输出流导入data1.txt数据,在主程序进行计算,最后输出时使用复数的求实部、虚部、模的方法输出。本文程序使用gcc编译计算,其中-lm是为了解决gcc编译过程中无法使用math函数的问题,具体过程如下:
geant4@geant4:~/caculation/TEST$ gcc caculation.cpp -lm
geant4@geant4:~/caculation/TEST$ ./a.out >b.out
geant4@geant4:~/caculation/TEST$
可以将输出内容直接导入b.out文件,b.out文件内容如下:
34.893002
第一个解的实部为11.092843, 虚部为0.000000, 模为11.092843
第二个解的实部为-15.311442, 虚部为-0.000000, 模为15.311442
第三个解的实部为3.245455, 虚部为0.000000, 模为3.245455
37.488998
第一个解的实部为10.888025, 虚部为0.000000, 模为10.888025
第二个解的实部为-15.394507, 虚部为-0.000000, 模为15.394507
第三个解的实部为3.533338, 虚部为0.000000, 模为3.533338
38.027000
第一个解的实部为10.843715, 虚部为0.000000, 模为10.843715
第二个解的实部为-15.411565, 虚部为-0.000000, 模为15.411565
第三个解的实部为3.594707, 虚部为0.000000, 模为3.594707
38.511002
第一个解的实部为10.803252, 虚部为0.000000, 模为10.803252
第二个解的实部为-15.426867, 虚部为-0.000000, 模为15.426867
第三个解的实部为3.650470, 虚部为0.000000, 模为3.650470
37.249001
第一个解的实部为10.907572, 虚部为0.000000, 模为10.907572
第二个解的实部为-15.386880, 虚部为-0.000000, 模为15.386880
第三个解的实部为3.506164, 虚部为0.000000, 模为3.506164省略~~~
参考文献:
[1]c语言公式法求解一元三次方程
[2]C语言实现复数运算
基于C语言使用卡尔丹公式法求解一元三次方程相关推荐
- c语言公式法求解一元三次方程
#include<stdio.h> #include<math.h> int main() {float a,b,c,d,x1,x2,x3,p,q,i,w,s1,s2,s3,X ...
- 用c语言求解ax2 bx c=0方程的根,用公式法求解一元二次方程ax
用公式法求解一元二次方程ax2+bx+c=0,并要求输出它的实根. 答案 思路分析:本题考查条件语句设计程序的应用.输入三个实数a,b,c,通过判断判别式Δ是否为零来求实根. 解:程序框图如图1-2- ...
- 弦截法c语言程序,用弦截法求解一元三次方程的根(利用c语言实现)
用弦截法求解一元三次方程的根(利用c语言实现)0 特别v2013.09.24浏览296次分享举报 #include #include float f(x) { float a,b,c,d; float ...
- 求三次样条函数c语言,基于C语言对三次样条函数的求解及程序.PDF
基于C语言对三次样条函数的求解及程序 Va1ueEngineering 95 . 基于C语言对三次样条函数的求解及程序 TheSolutionandtheProgram toCubicSplineFu ...
- C# 盛金公式 求解一元三次方程
class dd2{private static readonly double dsr3 = Math.Sqrt(3);// <summary>/// 盛金公式求解一元三次方程,ax^3 ...
- 求解一元三次方程(c语言)
求解一元三次方程 描述 格式 样例 题解及注释 描述 格式 样例 题解及注释 是数学的最小二分法 #include <stdio.h> #include <math.h> #i ...
- c语言求解一元三次方程(二分法和公式法)
一.二分法 1.二分法概念:二分法,又称分半法,是一种方程式根的近似值求法.对于区间[m,n]上连续不断且f(m)*f(n)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为 ...
- 用盛金公式求解一元三次方程
解一元三次方程一般用盛金公式求解,算法高效且求出来的解精确. 百度百科关于盛金公式有如下解释: 盛金公式 Shengjin's Formulas 一元三次方程aX^3+bX^2+cX+d=0, ...
- 求解一元三次方程的一个实数解
求解已知一元三次方程的一个实数解 上机内容:C++ 上机目的: 编程序求解方程2x3-5*x2+3x-6=0的1个实数根,要求精确到0.00001 已知f(x)=2x3-5*x2+3x-6 在> ...
最新文章
- 基于SIFT特征的全景图像拼接
- Python:高阶函数
- 第17课:循环神经网络(RNN)
- 课时5:闲聊之Python的数据类型
- php破坏代码,php不破坏单词截取子字符串
- ThreadPoolExecutor线程池 + Queue队列
- iOS- 快速实现展示布局
- python代码-你见过哪些令你瞠目结舌的 Python 代码技巧?
- 关于兰伯特投影得应用问题
- 抓包工具charles青花瓷的基本使用(android)
- STM32中AD采样的三种方法分析
- Spring Cloud如何可用于微服务架构
- Excel序号类操作实例
- 虚拟机网络与物理机网络互通
- 吴恩达机器学习(一)—— 简介
- 程序员的算法趣题:Q09 落单的男女(Java版)
- 网页被劫持跳转怎么办?发布网修复方法
- Oracle常用基本查询语句
- linux 图形界面无法弹出,xmanager无法弹出图形化界面。
- Sql 日期操作 获取年月日等