一元三次方程求根公式及其Fortran代码

合集下载

一元3次方程的求根公式

一元3次方程的求根公式

一元3次方程的求根公式一元三次方程的求根公式,这可是数学世界里一个有点复杂但又超级有趣的家伙!咱先来说说啥是一元三次方程哈。

就比如说 x³ - 6x² + 11x - 6 = 0 这样的式子,只有一个未知数 x ,最高次项是 3 ,这就是一元三次方程啦。

那求根公式到底是啥呢?它可不像一元二次方程的求根公式那么简单直接。

一元三次方程的求根公式叫卡尔丹公式。

这公式写出来有点长,也有点复杂,看着就让人头大。

我还记得我当年学这个的时候,那真是费了老大的劲。

老师在黑板上不停地写啊写,我在下面眼睛瞪得老大,脑子疯狂转。

当时我旁边的同桌,一个劲儿地挠头,嘴里还嘟囔着:“这咋这么难啊!” 我心里也犯嘀咕,但还是硬着头皮跟着老师的思路走。

咱来看看这个公式具体是啥样的。

一般的一元三次方程可以写成ax³ + bx² + cx + d = 0 的形式(a ≠ 0 ),然后通过一系列复杂的变换和推导,就能得到求根公式。

这里面涉及到好多计算和推理,稍不留神就容易出错。

不过啊,别被它吓到。

虽然公式复杂,但只要咱们掌握了方法,多做几道题练练手,也能慢慢搞明白。

就像我当初,课后自己做了好多练习题,一开始总是出错,不是这儿算错了,就是那儿忘变号了。

但坚持下来,慢慢地就找到感觉了。

其实在实际生活中,一元三次方程也有用武之地呢。

比如说工程计算里,设计一些复杂的结构时,可能就会用到。

学习一元三次方程的求根公式,就像是在攻克一座城堡。

有时候觉得自己怎么都攻不下来,可只要不放弃,一点一点地突破,最终还是能成功的。

希望大家在面对这个有点难啃的骨头时,都能有耐心和勇气,把它拿下!。

一元三次方程的求根公式

一元三次方程的求根公式

一、一元二次方程的回顾和启示学过初中数学都知道任何一个实系数一元二次方程 ax^2+bx+c=0,~a \neq 0通过配方可以得到 \left(x+\dfrac{b}{2a}\right)^2=\dfrac{b^2-4ac}{4a^2},根据判别式 \Delta=b^2-4ac的符号,可以判断方程实根的个数,并且可以得到求根公式x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}=-\frac{b}{2a}\pm\frac{\sqrt{\Delta}}{2a}\\\Delta>0时方程有 2个不同的实根,\Delta=0时有 1个二重实根,\Delta<0时有是 1对共轭虚根 \Delta<0;计算重数的情况下都是 2个根。

记两根为x_1=\frac{-b+\sqrt{b^2-4ac}}{2a} ,~ x_2=\frac{-b-\sqrt{b^2-4ac}}{2a} \\由根的表达式可以直接验证韦达定理:两根之和 x_1+x_2=-\dfrac{b}{a}以及两根之积 x_1x_2=\dfrac{c}{a},判别式 \Delta=a^2(x_1-x_2)^2.求根公式看上去复杂,但如果把上述两式代入求根公式,就可以得到x=-\frac{b}{2a}\pm\sqrt{\left(-\frac{b}{2a}\right)^2-\frac{c}{a}}=\frac{x_1+x_2}{2}\pm\sqrt{\left(\frac{x_1-x_2}{2}\right)^2}=\frac{x_1+x_2}{2}\pm\frac{x_1-x_2}{2}\\注:如果 x_1,~x_2是共轭虚根,x_1-x_2就是纯虚数,对负数 \left(\dfrac{x_1-x_2}{2}\right)^2开方不能得到 \dfrac{|x_1-x_2|}{2}.几何意义:记 s=\dfrac{x_1+x_2}{2}=-\dfrac{b}{2a}是两根的平均值,乘积为 p=x_1x_2=\dfrac{c}{a}. 如果 x_1,~x_2都是实根,则 d=\dfrac{|x_1-x_2|}{2}=\sqrt{s^2-p}是根到平均值的距离。

用计算机方法求一元三次方程的根

用计算机方法求一元三次方程的根

用计算机方法求一元三次方程的根
朱小琨
【期刊名称】《高等继续教育学报》
【年(卷),期】2003(016)005
【摘要】本文介绍了高等数学的近似计算方法中切线法和二分法的思想,再利用其思想结合计算机中的C程序设计语言,编写出了求一元三次方程根的程序,该程序稍加修改,即可成为求更高次方程根的程序.
【总页数】4页(P15-18)
【作者】朱小琨
【作者单位】华中师范大学学报编辑部,武汉,430079
【正文语种】中文
【中图分类】TP301.6
【相关文献】
1.FORTRAN77编制的求一元一次方程和一元二次方程的根 [J], 胡佳山
2.基于改进的遗传算法求一元非线性方程的根 [J], 曾毅
3.FORTRAN77编制的求一元一次方程和一元二次方程的根 [J], 胡佳山
4.FORTRAN77编制的求一元一次方程和一元二次方程的根 [J], 胡佳山
5.如何求一元方程的根 [J], 杜先云;任秋道
因版权原因,仅展示原文概要,查看原文内容请购买。

一元三次方程求根公式

一元三次方程求根公式

一元三次方程求根公式解法卡丹公式法的特殊情况一元三次方程都可化为x³ px q=0。

它的解是:其中。

根与系数的关系为。

判别式为。

当时,有一个实根和两个复根;时,有三个实根,当时,有一个三重零根,时,三个实根中有两个相等;时,有三个不等实根。

三个根的三角函数表达式(仅当时)为其中。

卡丹公式法的一般情况一般的一元三次方程可写成的形式。

上式除以,并设,则可化为如下形式:,其中,。

可用特殊情况的公式解出,则原方程的三个根为。

三个根与系数的关系为。

盛金公式法三次方程应用广泛。

用根号解一元三次方程,虽然有著名的卡尔丹公式,并有相应的判别法,但使用卡尔丹公式解题比较复杂,缺乏直观性。

范盛金推导出一套直接用a、b、c、d表达的较简明形式的一元三次方程的一般式新求根公式——盛金公式,并建立了新判别法——盛金判别法。

1.盛金公式一元三次方程aX bX cX d=0,(a,b,c,d∈R,且a≠0)重根判别式总判别式Δ=B-4AC。

当A=B=0时,盛金公式1:当Δ=B-4AC>0时,盛金公式2:盛金公式2的三角式:其中,。

当Δ=B-4AC=0时,盛金公式3:其中。

当Δ=B-4AC<0时,盛金公式4:其中,(A>0,-1<T<1)。

2.盛金判别法当A=B=0时,方程有一个三重实根。

当Δ=B-4AC>0时,方程有一个实根和一对共轭虚根。

当Δ=B-4AC=0时,方程有三个实根,其中有一个二重根。

当Δ=B-4AC<0时,方程有三个不相等的实根。

3.盛金定理当b=0,c=0时,盛金公式1无意义;当A=0时,盛金公式3无意义;当A≤0时,盛金公式4无意义;当T<-1或T>1时,盛金公式4无意义。

当b=0,c=0时,盛金公式1是否成立?盛金公式3与盛金公式4是否存在A≤0的值?盛金公式4是否存在T<-1或T>1的值?盛金定理给出如下回答:盛金定理1:当A=B=0时,若b=0,则必定有c=d=0(此时,方程有一个三重实根0,盛金公式1仍成立)。

现在最常用的解一元三次方程公式

现在最常用的解一元三次方程公式

现在最常用的解一元三次方程公式下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!解一元三次方程是高中数学中的常见问题。

在解一元三次方程时,我们通常会使用下面介绍的公式。

一元三次方程万能求根公式

一元三次方程万能求根公式

一元三次方程万能求根公式一元三次方程,听上去是不是有点吓人?其实它就像一道数学小题,咱们今天就来聊聊这个“万能求根公式”。

别担心,数学不一定得是严肃的,它也可以轻松有趣,咱们就像聊聊天一样。

想象一下你在海边捡贝壳,偶尔捡到一个特别的,嘿,就是一元三次方程!你心里想:“这玩意儿能干嘛?”其实它的世界大有可为。

这方程的形状就像个有点叛逆的孩子,写成了ax³ + bx² + cx + d = 0。

你一看就觉得,这一堆字母可不是简单的加减乘除呀。

可别急,其实它的背后藏着很多有趣的故事和小秘密。

咱们找找这个“万能求根公式”,听起来像是超能力一样,能让这复杂的方程轻松变得简单。

想象一下,拿出一把万能钥匙,哐当一下,门就开了,问题迎刃而解。

先来个大概念,咱们说的这个公式啊,通常写得有点复杂,但别被吓到。

其实就是为了找出那几个神秘的根,方程的解。

你可以把它看作是方程的好朋友,帮助它找到自己的归属。

想象一下,方程就像一个失落的小孩,根就是它的家,终于找到了可以回去的路。

说到这里,很多小伙伴可能会皱眉头:“这根到底是什么啊?”简单来说,根就是让方程等于零的那些数字。

比如说,咱们用这个公式来求解,可能会得到几个不一样的数字,嘿,这就是它的根。

就像你去找丢失的钥匙,结果翻遍了沙发底下,最后竟然在冰箱里找到了,哈哈,没想到吧?好,咱们再深入一点。

这个公式的确是有点长,像个古老的诗句,但其实它的用法不复杂。

你只需要代入你的系数 a、b、c 和 d,然后一通运算,哗啦啦,结果就出来了。

就像你跟朋友去做一顿丰盛的晚餐,准备食材、调料,然后一气呵成,最后享受美味的过程。

哎呀,光是想象都觉得美好。

很多人可能会觉得,这数学公式太高深,跟自己无缘。

其实啊,生活中到处都有数学的影子。

比如说,你在超市买菜,算算价格,或者打折的时候,看看划不划算,这不就是在做数学吗?一元三次方程也是其中之一,只不过它可能会让你感到一丝神秘感。

一元三次方程怎么解求根公式

一元三次方程怎么解求根公式

一元三次方程怎么解求根公式一元三次方程,是数学中最基本的方程,它的应用非常广泛,但很多时候遇到它,都不知如何求解它的根,这里就介绍一元三次方程怎么解求根的基本公式,希望能够对有此需求的朋友有所帮助。

一元三次方程的求根公式一元三次方程的求根公式是卡塔兰数(Caterane Numbers)中的公式,它的基本形式是:x^3 + ax^2 + bx + c = 0其中a、b、c可以是实数。

求根公式为:x = [a/3 + (a/3)^2 + (a/3)^3 + (b/2)^2]^(1/2) + (b/2) (a/3) x = [a/3 (a/3)^2 (a/3)^3 + (b/2)^2]^(1/2) (b/2) (a/3)x = [(b/2) + (a/3) + (a/3)^2 + (a/3)^3 + (b/2)^2]^(1/2) (b/2) + (a/3)x = [(b/2) (a/3) (a/3)^2 (a/3)^3 + (b/2)^2]^(1/2) + (b/2) + (a/3)求根公式的应用当a、b、c都已知时,可以应用求根公式求解三次方程,如:求解方程:x^3 + 2x^2 11x + 6 = 0则由公式:x = [2/3 + (2/3)^2 + (2/3)^3 + (11/2)^2]^(1/2) + (11/2) (2/3)x = [2/3 (2/3)^2 (2/3)^3 + (11/2)^2]^(1/2) (11/2) (2/3) x = [(11/2) + (2/3) + (2/3)^2 + (2/3)^3 + (11/2)^2]^(1/2) (11/2) + (2/3)x = [(11/2) (2/3) (2/3)^2 (2/3)^3 + (11/2)^2]^(1/2) + (11/2) + (2/3)计算得x = 1, 2, 3其他求根方法除了卡塔兰数求根公式外,还有其他一些求根方法,如:(1)因式分解法:当三次方程中出现多项式的时候,可以尝试使用因式分解的方法求解,这种方法比较容易,但是无法处理复杂的一元三次方程。

一元三次方程公式大全

一元三次方程公式大全

一元三次方程公式大全
一元三次方程是指形式为ax^3 + bx^2 + cx + d = 0的三次方程。

解一元三次方程的方法有很多种,可以通过因式分解、换元法、牛顿法、Cardano公式等多种方法来求解。

下面我将从不同角度介
绍一元三次方程的求解方法和公式。

1. 因式分解法:
对于一元三次方程ax^3 + bx^2 + cx + d = 0,如果能够
因式分解为(x r)(ax^2 + bx + c) = 0的形式,其中r为实数根,
那么我们可以先通过因式分解找到一个实数根,然后再使用因式分
解或者配方法求得另外两个根。

2. 换元法:
通过变量代换的方法,将一元三次方程转化为二次方程的形式,然后利用二次方程的求根公式来求解。

3. 牛顿法:
牛顿法是一种迭代逼近的方法,通过不断迭代计算,可以逼近一元三次方程的根。

4. Cardano公式:
对于一元三次方程ax^3 + bx^2 + cx + d = 0,Cardano公式给出了其解的表达式,但是由于其表达式较为复杂,实际应用中并不常用。

总的来说,一元三次方程的求解方法有很多种,选择合适的方法取决于具体的问题和方程的形式。

在实际应用中,常常需要根据具体情况灵活选择合适的方法来求解一元三次方程。

希望以上介绍对你有所帮助。

一元三次方程求根公式完整推导过程

一元三次方程求根公式完整推导过程

=
−3 p 3
cos
4π + α 3
− i sin
4π + α 3
−3 p 3
cos
2π + α 3
+ i sin
2π + α 3
u3 = w2u1 =
−3 p 3
cos
4π + α 3
+ i sin
4π + α 3
v3 = w1v1 =
−3 p 3
cos
2π + α 3
− i sin

b3 27a
3
)
+
b(
y
2

2by 3a
+
b2 9a 2
) + c(y

b )+ 3a
d
=
0

ay 3
− by 2
+
b2 3a
y−
b3 27a 2
+ by 2

2b 2 3a
y+
b3 9a 2
+ cy −
bc 3a
+d
=0

ay 3
+ (c −
b2 )y 3a
+ (d
+
2b 3 27a 2

bc ) 3a
=
0

y3
+
(c a

b2 3a 2
)
y
+
(
d a
+
2b3 27a 3

bc 3a 2
)
=
0
如此一来二次项就不見了,化成

python一元三次方程求根代码

python一元三次方程求根代码

python一元三次方程求根代码以下是一个用Python编写的一元三次方程求根的代码:```pythonimport cmathdef solve_cubic_equation(a, b, c, d):discriminant = b**2 - 3*a*cif discriminant == 0:root1 = (-b + cmath.sqrt(b**2 - 3*a*c)) / (3*a) root2 = root1root3 = (-b - 2*cmath.sqrt(b**2 - 3*a*c)) / (3*a) elif discriminant > 0:Q = (-b + cmath.sqrt(b**2 - 3*a*c))/2.0R1=Q**3-(b*c-3*a*d)/2.0R2=-Q**3-(b*c-3*a*d)/2.0S = cmath.cbrt(R1) if R1 >= 0 else -cmath.cbrt(-R1) T = cmath.cbrt(R2) if R2 >= 0 else -cmath.cbrt(-R2) root1 = (S+T) - b/(3*a)else:t = (2*b**3 - 9*a*b*c + 27*a**2*d)/(2*(cmath.sqrt(-(b**2 - 3*a*c)**3)))root1 = (-b + cmath.sqrt(b**2 - 3*a*c)*(1 +1j*cmath.sqrt(3))/2)**(1/3) + ((-b + cmath.sqrt(b**2 -3*a*c))*(1 - 1j*cmath.sqrt(3))/(2*cmath.sqrt(b**2 -3*a*c)))**(1/3) - b/(3*a)root2 = (-b + cmath.sqrt(b**2 - 3*a*c))*(1 -1j*cmath.sqrt(3))/(2*cmath.sqrt(b**2 - 3*a*c))*(-0.5 +1j*cmath.sqrt(3)) + (-b + cmath.sqrt(b**2 - 3*a*c))*(1 +1j*cmath.sqrt(3))/(2*cmath.sqrt(b**2 - 3*a*c)) - b/(3*a) root3 = (-b + cmath.sqrt(b**2 - 3*a*c))*(1 -1j*cmath.sqrt(3))/(2*cmath.sqrt(b**2 - 3*a*c))*(-0.5 -1j*cmath.sqrt(3)) + (-b + cmath.sqrt(b**2 - 3*a*c))*(1 +1j*cmath.sqrt(3))/(2*cmath.sqrt(b**2 - 3*a*c)) - b/(3*a) return (root1, root2, root3)#测试:a=1b=-6c=11d=-6roots = solve_cubic_equation(a, b, c, d)print("根1:", roots[0])print("根2:", roots[1])print("根3:", roots[2])```这个代码可以解决一元三次方程形式为`ax^3 + bx^2 + cx + d = 0`的问题。

一元三次方程求根公式

一元三次方程求根公式

I
第1章
一元三次方程求根公式
第 1 章 一元三次方程求根公式
1 求根公式
如下图所示,在 MATLAB 里执行如下两条命令: syms a b c d solve('a*x^3+b*x^2+c*x+d')
图1
将得到一元三次方程 ax3 bx 2 cx d 0 的求根公式。经笔者整理后,得 u 9abc 27 a 2 d 2b3 54a 3
2 3
(1)
9abc 27 a 2 d 2b3 3ac b 2 v 2 54a 3 9a
3 b c 18abcd 27 a d 4b d
3
(2)
18a 2
1
第1章
3 uv m 3 uv
(18)
上式中, n 有三种取值 0,1,2,且满足下式
n MN p 3 P
方程(9)的三个根为:
(19)
x1 y1 b 3a x2 y2 b 3a x y b 3a 3 3
(20)
5
第1章
一元三次方程求根公式
2.1 验证

(9)
b y x 3a 3ac b 2 p 3a 2 27 a 2 d 9abc 2b3 q 27a 3
(10)
4
第1章
一元三次方程求根公式
则方程(9)可转化为下式
y 3 py q 0
求解上式中 y 的计算步骤如下: p P 3 q Q 2
x[3]; x1(1.0,0.0); //随便填 x2(2.0,0.0); //随便填 x3(3.0,0.0); //随便填 a (4.5,0.0); //随便填(不为零即可) b = a * (-x1-x2-x3); c = a * (x2 * x3 + x1 * x3 + x1 * x2); d = a * (-x1 * x2 * x3);

一元三次方程根

一元三次方程根

一元三次方程根一元三次方程根是指三次方程ax³+bx²+cx+d=0的解,通常用x1,x2,x3表示。

在实数范围内,求解一元三次方程的根可以采用多种方法,其中包括求根公式、梯度下降法和牛顿迭代法等。

求解一元三次方程的根常常采用求根公式的方法。

这里我们先讲解一下求根公式法,我们可以将三次方程转化为标准形式。

标准形式是指将多项式按照降幂顺序排列,然后去掉次数为零的项后,系数排列在一起,并降幂写出。

因此,标准形式也被称为降幂形式。

对于一元三次方程,其标准形式为:ax³+bx²+cx+d=0。

下面我们通过求根公式来求解它。

首先,我们将其标准化,将其变成x³+px²+q x+r=0。

然后,我们可以使用如下公式来求解它的根:x1=−p3+3q3a,x2=−p3−3q3+12p3a,x3=−p3−3q3−12p3a 其中,a、b、c和d都是实数,p=b/a,q=c/a和r=d/a。

这些方程的根支持判断三个实数解中的哪一个解为最小的、最大的或次大的,以及在三角函数和双曲函数中的应用。

然而,对于一元三次方程的求解,上述公式并不总是适用于实数解。

如果方程没有实数解,那么我们需要使用复数解代替。

同时,在实际应用中,计算复杂些的方程,也更应该使用牛顿迭代法或梯度下降法来求解。

接下来,我们将进一步介绍这些解决方案。

接下来我们将介绍梯度下降法以及牛顿迭代法。

梯度下降法是非常常用的一种迭代算法。

在求解一元三次方程的根时,我们可以通过梯度下降法来迭代求解。

具体而言,我们可以通过以下公式来进行下一次迭代的计算:f(xi−1)−f(xi)∂xif(x)其中f(x)是我们需要求解的三次方程,∂xif(x)是f(x)对变量xi的导数,而xi是上一次迭代中的变量值。

我们可以不断重复这个过程,直到得到收敛解。

梯度下降法是通过计算函数在给定点的梯度、将变量在梯度的反方向上进行更新来求解最优解的方法,这个方法适用于不同的目标函数(没有特定解的优化问题)。

一元三次方程求根

一元三次方程求根

一元三次方程求根
第一:计算方法
X(n+1)=Xn+[A/X^2-Xn)1/3
n,n+1是下角标,A被开方数。

例如,A=5,5介于1的.3次方至2的3次方之间。

X0可以取
1.1;1.2;1.3;1.4;1.5;1.6;1.7;1.8;1.9;
2.0我们可以随意代入一个数,例如2,那么:
第一步,2+[5/(2×2)-2]×1/3=1.7=X1;
第二步,1.7+[5/(1.7×1.7)-1.7]×1/3=1.71=X2;
第三步,1.71+[5/(1.71×1.71)-1.71]×1/3=1.709=X3;
每次多取一位数。

公式会自动反馈到正确的数值。

第二:置换群解法
一元三次方程系数和根的关系如下:求出X,Y,后有这是个线性方程,其中为原方程的三个根!
第三:公式法(卡尔丹公式)
若用A、B换元后,公式可简记为:
x1=A^(1/3)+B^(1/3);
x2=A^(1/3)ω+B^(1/3)ω^2;
x3=A^(1/3)ω^2+B^(1/3)ω。

判别法
当△=(q/2)^2+(p/3)^3>0时,有一个实根和一对个共轭虚根;
当△=(q/2)^2+(p/3)^3=0时,有三个实根,其中两个相等;
当△=(q/2)^2+(p/3)^3<0时,有三个不相等的实根。

一元二次、三次及四次方程求根程序代码

一元二次、三次及四次方程求根程序代码

#include <stdio.h>#include <math.h>int main(){int n;double a,b,c,d,e;void action1(double a,double b,double c);void action2(double a,double b,double c,double d);void action3(double a,double b,double c,double d,double e);printf("1.AX^2+BX+C=0\n\n2.AX^3+BX^2+CX+D=0\n\n3.AX^4+BX^3+CX^2+DX+E=0\ n\n");do{printf("Please choose 1, 2 or 3:");scanf("%d",&n);}while (n!=1&&n!=2&&n!=3);printf("\n");if (n==1){do{printf("A=");scanf("%lf",&a);}while (a==0);printf("B=");scanf("%lf",&b);printf("C=");scanf("%lf",&c);printf("\n");action1(a,b,c);}if (n==2){do{printf("A=");scanf("%lf",&a);}while (a==0);printf("B=");scanf("%lf",&b);printf("C=");scanf("%lf",&c);printf("D=");scanf("%lf",&d);printf("\n");action2(a,b,c,d);}if (n==3){do{printf("A=");scanf("%lf",&a);}while (a==0);printf("B=");scanf("%lf",&b);printf("C=");scanf("%lf",&c);printf("D=");scanf("%lf",&d);printf("E=");scanf("%lf",&e);printf("\n");action3(a,b,c,d,e);}printf("\nCopyright © Li Lei, All rights reserved.\n");return 0;}void action1(double a,double b,double c){double K,L,S,x1,x2;double det(double a,double b,double c,double d);b=b/2;K=-b/a;L=det(a,b,b,c);if (fabs(L)<=1e-10)printf("x1=x2=%f\n",K);if (L>1e-10){S=sqrt(L);printf("x1=%f-%fi\nx2=%f+%fi\n",K,S,K,S);}if (L<-1e-10){x1=K-sqrt(-L);x2=K+sqrt(-L);printf("x1=%f\nx2=%f\n",x1,x2);}}void action2(double a,double b,double c,double d){double K,L,M,p,q,disc,x1,x2,x3,t1,t2;double curt(double x);double det(double a,double b,double c,double d);b=b/3;c=c/3;K=-b/a;L=det(a,b,b,c);M=det(a,b,c,d);p=L;q=K*L+M/2;disc=q*q+p*p*p;if (fabs(disc)<=1e-10){if (fabs(q)<=1e-10)printf("x1=x2=x3=%f\n",K);else{x1=K+2*curt(-q);x2=K-curt(-q);printf("x1=%f\nx2=x3=%f\n",x1,x2);}}if (disc>1e-10){double m,n;disc=sqrt(disc);t1=-q-disc;t2=-q+disc;t1=curt(t1);t2=curt(t2);x1=K+t1+t2;m=K-(t1+t2)/2;n=sqrt(3)*(t2-t1)/2;printf("x1=%f\nx2=%f-%fi\nx3=%f+%fi\n",x1,m,n,m,n);}if (disc<-1e-10){if (fabs(q)<=1e-10){x1=K-sqrt(-3*p);x2=K;x3=K+sqrt(-3*p);}else{double x;disc=sqrt(-disc);x=atan2(disc,-q);t1=sqrt(-p)*cos(x/3);t2=sqrt(-3*p)*sin(x/3);x1=K-t1-t2;x2=K-t1+t2;x3=K+2*t1;}printf("x1=%f\nx2=%f\nx3=%f\n",x1,x2,x3);}}void action3(double a,double b,double c,double d,double e){double K,L,M,N,P0,Q0,R0,disc,x1,x2,x3,x4,X1,X2,X3,x,S,T;double curt(double x);double det(double a,double b,double c,double d);b=b/4;c=c/6;d=d/4;K=-b/a;L=det(a,b,b,c);M=det(a,b,c,d);N=det(a,b,d,e);P0=6*L;Q0=8*K*L+4*M;R0=3*K*K*L+3*K*M+N;if (fabs(Q0)<=1e-10){P0=P0/2;disc=P0*P0-R0;if (fabs(disc)<=1e-10){if (fabs(P0)<=1e-10)printf("x1=x2=x3=x4=%f\n",K);if (P0>1e-10){S=sqrt(P0);printf("x1=x2=%f-%fi\nx3=x4=%f+%fi\n",K,S,K,S);}if (P0<-1e-10){S=sqrt(-P0);x1=K-S;x3=K+S;printf("x1=x2=%f\nx3=x4=%f\n",x1,x3);}}if (disc>1e-10){X1=-P0-sqrt(disc);X2=-P0+sqrt(disc);if (fabs(X2)<=1e-10){S=sqrt(-X1);printf("x1=x2=%f\nx3=%f-%fi\nx4=%f+%fi\n",K,K,S,K,S);}if (fabs(X1)<=1e-10){S=sqrt(X2);x1=K-S;x4=K+S;printf("x1=%f\nx2=x3=%f\nx4=%f\n",x1,K,x4);}if (X2<-1e-10){S=sqrt(-X1);T=sqrt(-X2);printf("x1=%f-%fi\nx2=%f-%fi\nx3=%f+%fi\nx4=%f+%fi\n",K,S,K,T,K,T,K,S);}if (X1>1e-10){S=sqrt(X1);T=sqrt(X2);x1=K-T;x2=K-S;x3=K+S;x4=K+T;printf("x1=%f\nx2=%f\nx3=%f\nx4=%f\n",x1,x2,x3,x4);}if (X1<-1e-10&&X2>1e-10){S=sqrt(-X1);T=sqrt(X2);x1=K-T;x2=K+T;printf("x1=%f\nx2=%f\nx3=%f-%fi\nx4=%f+%fi\n",x1,x2,K,S,K,S);}}if (disc<-1e-10){disc=sqrt(-disc);x=atan2(disc,-P0);S=pow(R0,1/4.0)*sin(x/2);x1=K-pow(R0,1/4.0)*cos(x/2);x3=K+pow(R0,1/4.0)*cos(x/2);printf("x1=%f-%fi\nx2=%f+%fi\nx3=%f-%fi\nx4=%f+%fi\n",x1,S,x1,S,x3,S,x3,S);}}else{double P,Q,R,i,j,k,m,n,p,q,t1,t2;P=(P0*P0-4*R0)/(6*Q0);Q=-P0/6;R=Q0/8;k=-P;i=det(1,P,P,Q);j=det(1,P,Q,R);p=i;q=k*i+j/2;disc=q*q+p*p*p;if (fabs(disc)<=1e-10&&fabs(q)<=1e-10){x1=K+3*k;x2=K-k;printf("x1=%f\nx2=x3=x4=%f\n",x1,x2);}if (fabs(disc)<=1e-10&&fabs(q)>1e-10){X1=k+2*curt(-q);X2=k-curt(-q);if (X1>1e-10&&X2>1e-10||X1<-1e-10&&X2<-1e-10){x1=K-2*sqrt(X1*X2)+X2;x2=K+2*sqrt(X1*X2)+X2;x3=K-X2;printf("x1=%f\nx2=%f\nx3=x4=%f\n",x1,x2,x3);}if (X1<-1e-10&&X2>1e-10||X1>1e-10&&X2<-1e-10){x1=K-X2;S=K+X2;T=2*sqrt(-X1*X2);printf("x1=x2=%f\nx3=%f-%fi\nx4=%f+%fi\n",x1,S,T,S,T);}}if (disc>1e-10){double r;disc=sqrt(disc);t1=-q-disc;t2=-q+disc;t1=curt(t1);t2=curt(t2);X1=k+t1+t2;m=k-(t1+t2)/2;n=sqrt(3)*(t2-t1)/2;r=m*m+n*n;r=sqrt(r);x=atan2(n,m);if (X1>1e-10){x1=K+r-2*sqrt(X1*r)*cos(x/2);x2=K+r+2*sqrt(X1*r)*cos(x/2);S=K-r;T=2*sqrt(X1*r)*sin(x/2);}if (X1<-1e-10){x1=K-r-2*sqrt(-X1*r)*sin(x/2);x2=K-r+2*sqrt(-X1*r)*sin(x/2);S=K+r;T=2*sqrt(-X1*r)*cos(x/2);}printf("x1=%f\nx2=%f\nx3=%f-%fi\nx4=%f+%fi\n",x1,x2,S,T,S,T); }if (disc<-1e-10){if (fabs(q)<=1e-10){X1=k-sqrt(-3*p);X2=k;X3=k+sqrt(-3*p);}else{disc=sqrt(-disc);x=atan2(disc,-q);t1=sqrt(-p)*cos(x/3);t2=sqrt(-3*p)*sin(x/3);X1=k-t1-t2;X2=k-t1+t2;X3=k+2*t1;}if (X1>1e-10||X3<-1e-10){if (X1>1e-10){x1=K+sqrt(X1*X2)-sqrt(X1*X3)-sqrt(X2*X3);x2=K-sqrt(X1*X2)+sqrt(X1*X3)-sqrt(X2*X3);x3=K-sqrt(X1*X2)-sqrt(X1*X3)+sqrt(X2*X3);x4=K+sqrt(X1*X2)+sqrt(X1*X3)+sqrt(X2*X3);}if (X3<-1e-10){x1=K-sqrt(X1*X2)-sqrt(X1*X3)-sqrt(X2*X3);x2=K-sqrt(X1*X2)+sqrt(X1*X3)+sqrt(X2*X3);x3=K+sqrt(X1*X2)-sqrt(X1*X3)+sqrt(X2*X3);x4=K+sqrt(X1*X2)+sqrt(X1*X3)-sqrt(X2*X3);}printf("x1=%f\nx2=%f\nx3=%f\nx4=%f\n",x1,x2,x3,x4); }if (X1<-1e-10&&X3>1e-10){if (X2>1e-10){S=K-sqrt(X2*X3);T=K+sqrt(X2*X3);m=sqrt(-X1*X3)-sqrt(-X1*X2);n=sqrt(-X1*X3)+sqrt(-X1*X2);}if (X2<-1e-10){S=K-sqrt(X1*X2);T=K+sqrt(X1*X2);m=sqrt(-X1*X3)+sqrt(-X2*X3);n=sqrt(-X1*X3)-sqrt(-X2*X3);}printf("x1=%f-%fi\nx2=%f+%fi\nx3=%f-%fi\nx4=%f+%fi\n",S,m,S,m,T,n,T,n);}}}}double det(double a,double b,double c,double d){return((a*d-b*c)/(a*a));}double curt(double x){return (x>=0?pow(x,1/3.0):-pow(-x,1/3.0));}。

fortran求三次根的函数

fortran求三次根的函数
在`test_cuberoot`程序中,首先要求用户输入一个数值,然后调用`cuberoot`函数计算其 三次根,并将结果输出到屏幕上。
请注意,上述示例中的代码是针对Fortran 90及以上版本编写的。如果使用较旧的 Fortran版本,请相应地进行调整。
! 输出结果 write(*,*) "The cube root of ", x, " is: ", result
end program test_cuberoot ```
fortran求三次根的函数
在上面的示例中,`cuberoot`函数接受一个实数作为输入,并返回其三次根。如果输入数 值大于等于0,则直接计算其三次根;如果输入数值小于0,则先取其绝对值的三次根,然后 再取相反数。
end if end function cuberoot
program test_cuberoot implicit none real :: x, result
! 输入需要求解三次根的数值 write(*,*) "Enter a number: " read(*,*) x
! 调用cuberoot函数求解三次根 result = cuberoot(x)
fortran求三次根的函数
以下是用Fortran编写的求解三次根的函数示例:
Hale Waihona Puke ```fortran function cuberoot(x)
implicit none real :: x, cuberoot
if (x >= 0) then cuberoot = x**(1.0/3.0)
else cuberoot = -(-x)**(1.0/3.0)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

− kπ 3 − 3 R(R) =R = z √ |z| cos( θ+2 ), k = 0, 1, −1 √ 3 − − − − − − − − − − − − − − − − − = |z| √ = α2 + |Δ| √α2 − = α2 + β 3 β 3/2 θ = arccos( |α ) = arccos( z|
其中 Δ 即为三次方程根的判别式,由其容易看出:

当 Δ > 0 时,方程有一个实根 x1 和两个共轭复根 x2 、x3
3 当 Δ = 0 时,有 R1 = R2 = √ α =R ,
− −

若 R ≠ 0 ,方程有一个实根 x1 = −b + 2R 和一个二重复根
x2 = x3 = −b − R
f (x)=
x3 +
3b 2 x 3a
+
6c x 6a
+
2d = 2a
x3 + 3b′ x2 + 6c′ x + 2d ′ =0 形式,为简便我们仍记 α2 − β 3 , R1 = − − − − − − − 3 − √ α + √Δ , R2 = − − − − − − − 3 − √ α − √Δ
Delt = Alph*Alph-Beta*Beta*Beta
============================================================================================
很显然,Δ < 0 的情况最复杂,也很让人迷惑,因为实根必须借助于复数才能求得,这也是 最初要引入复数的原因。由于我没有学过复变函数,下面的说法可能有误,说出来只是为了 帮助大家理解。
3 ¯= ¯ 当 Δ < 0 时,记 z = α + √|Δ| i, z α − √|Δ|i, R1 = √ z, R2 = √z 3 3 ¯ ¯ ¯ ¯ ,则 R = R 3 ¯1 ,记 R1 = R, R2 = ¯= ¯=¯ ,ω 为 √z z R √ 2
− −
−− −
−1+√3i ¯ = ,ω 2
−1−√3i 2
个根可写作:
¯ x1 = −b + R1 + R2 = −b + R + R x2 = −b − x3 = −b −
很显然
(R1 +R2 ) 2 (R1 +R2 ) 2
+ −
√3(R1 −R2 ) i 2 √3(R1 −R2 ) i 2
¯ ¯R = −b + ωR + ω ¯ ¯ R + ωR = −b + ω
作 f (x) =
x3 + 3bx2 + 6cx + 2d = 0 ,令 b2 − 2c, Δ =
α = −b3 + 3bc − d, β=
,则方程的三个根可写作:
x1 = −b + R1 + R2 x2 = −b − x3 = −b −
(R1 +R2 ) 2 (R1 +R2 ) 2
+ −
√3(R1 −R2 ) i 2 √3(R1 −R2 ) i 2

若 R= 0 ,方程只有一个三重复根 x1 = x2 = x3 = −b
α ) β 3/2

当 Δ < 0 时,方程有三个不等实根,令 θ = arccos(
,则
x1 = −b + 2√β cos( θ ) 3
π x2 = −b + 2√β cos( θ+2 ) 3 π x3 = −b + 2√β cos( θ−2 ) 3
π 旋转 23 的复数,所以 x 2 , x 3 并不能给出新的根。
x1 = −b + 2R(R)
α ) β 3/2
由于复变函数的多值性,我们一下就得到了所有的三个根,正如上面所给出的。另外由于 ω 对应的正是
==============================J*e*r*k*w*i*n*@*g*m*a*i*l*.*c*o*m============================= 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 30| 31| 32| 33| if(Delt>0.D0) then tht = Alph+sqrt(Delt); R1 = sign(abs(tht)**(1.D0/3.D0), tht) tht = Alph-sqrt(Delt); R2 = sign(abs(tht)**(1.D0/3.D0), tht) X(1) = -b+R1+R2 else if(Delt==0.D0) then R1 = sign(abs(Alph)**(1.D0/3.D0), Alph) if(R1==0.D0) then X(1) = -b else X(1) = -b+2.D0*R1 X(2) = -b-R1 end if else if(Delt<0.D0) then tht = acos(Alph/(sqrt(Beta)*Beta)) X(1) = -b+2.D0*sqrt(Beta)*cos(tht/3.D0) X(2) = -b+2.D0*sqrt(Beta)*cos((tht+TwoPi)/3.D0) X(3) = -b+2.D0*sqrt(Beta)*cos((tht-TwoPi)/3.D0) end if End Subroutine getCubicRoot Alph = -b*b*b + 3.D0*b*c -d Beta = b*b -2.D0*c X = 0.D0 a = P(1) b = P(2)/(3.D0*a) c = P(3)/(6.D0*a) d = P(4)/(2.D0*a) Subroutine getCubicRoot(P, X) real*8, parameter:: TwoPi = 8.D0*atan(1.D0) real*8 P(*), a, b, c, d, Alph, Beta, Delt, R1, R2, tht, X(3)
一元三次方程求根公式及其Fortran代码
一元三次方程的求解比一元二次方程困难,求根公式看起来也很复杂,中文维基百科上原先 的三角函数解公式有误,我已经修改过了。但是我觉得还有必要将这些公式简化一下,给出 具体的算法,以便编程使用。 首先需要明确,一元三次方程 f (x) =ax3 + bx2 + cx + d = 0, (a ≠ 0) 至少有一个实 根。这是由于 f (−∞) = −∞, f (∞) = ∞ ,而 f (x) 在整个区间上连续,所以由微积分 的介值定理,必存在一点 x0 满足 f (x0 ) = 0 。直观上也很容易理解,曲线 f (x) 取值范 围为负无穷到正无穷,那么它与 x 轴至少有一个交点,这个交点就是方程的实根。这个结论 可以推广到所有奇数次的多项式方程。 对一元三次方程 f (x) =ax3 + bx2 + cx + d = 0, (a ≠ 0) ,首先化为
相关文档
最新文档