<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<body>
<div align="center">例如输入:a=3, b=6, c=-123, d=-126 e=1080</div>
<form name="form1" action="">
ax<sup>4</sup> + bx<sup>3</sup> + cx<sup>2</sup> + dx + e = 0
<table border="0" align="center" colspan="4" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><input type="text" name="aIn" size="5" placeholder="a">x<sup>4</sup> +</td>
<td><input type="text" name="bIn" size="5" placeholder="b">x³ +</td>
<td><input type="text" name="cIn" size="5" placeholder="c">x² +</td>
<td><input type="text" name="dIn" size="5" placeholder="d">x +</td>
<td><input type="text" name="eIn" size="5" placeholder="e">e</td>
</tr>
</tbody>
</table>
<center>
<input type="button" name="button1" value="计算" onclick="quad4solve(this.form)">
</center>
<table border="0" class="innerc" cellspacing="0" cellpadding="3">
<tbody>
<tr align="center">
<td class="inner" colspan="4"><b>结果:</b></td>
</tr>
<tr>
<td>x<sub>1</sub>:
<input type="text" name="x1Re" size="25"> +
<input type="text" name="x1Im" size="25"> i
</td>
</tr>
<tr>
<td>x<sub>2</sub>:
<input type="text" name="x2Re" size="25"> +
<input type="text" name="x2Im" size="25"> i
</td>
</tr>
<tr>
<td>x<sub>3</sub>:
<input type="text" name="x3Re" size="25"> +
<input type="text" name="x3Im" size="25"> i
</td>
</tr>
<tr>
<td>x<sub>4</sub>:
<input type="text" name="x4Re" size="25"> +
<input type="text" name="x4Im" size="25"> i
</td>
</tr>
</tbody>
</table>
</form>
<script type="text/javascript">
function quad4solve(dataForm)
{
var a = parseFloat(dataForm.aIn.value);
var b = parseFloat(dataForm.bIn.value);
var c = parseFloat(dataForm.cIn.value);
var d = parseFloat(dataForm.dIn.value);
var e = parseFloat(dataForm.eIn.value);
if (a == 0)
{
alert("The coefficient of the power four of x is 0. Please use the utility for a third degree quadratic.");
return;
}
if (e == 0)
{
alert("One root is 0. Now divide through by x and use the utility for a third degree quadratic to solve the resulting equation for the other three roots.");
return;
}
if (a != 1)
{
b /= a;
c /= a;
d /= a;
e /= a;
}
//立方解算器系数
var cb, cc, cd;
var discrim, q, r, RRe, RIm, DRe, DIm, dum1, ERe, EIm, s, t, term1, r13, sqR, y1, z1Re, z1Im, z2Re;
cb = -c;
cc = -4.0*e + d*b;
cd = -(b*b*e + d*d) + 4.0*c*e;
if (cd == 0)
{
alert("cd = 0.");
}
q = (3.0*cc - (cb*cb))/9.0;
r = -(27.0*cd) + cb*(9.0*cc - 2.0*(cb*cb));
r /= 54.0;
discrim = q*q*q + r*r;
term1 = (cb/3.0);
if (discrim > 0)
{
// 1 实数, 2 复数
s = r + Math.sqrt(discrim);
s = ((s < 0) ? -Math.pow(-s, (1.0/3.0)) : Math.pow(s, (1.0/3.0)));
t = r - Math.sqrt(discrim);
t = ((t < 0) ? -Math.pow(-t, (1.0/3.0)) : Math.pow(t, (1.0/3.0)));
y1 = -term1 + s + t;
}
else
{
if (discrim == 0)
{
r13 = ((r < 0) ? -Math.pow(-r,(1.0/3.0)) : Math.pow(r,(1.0/3.0)));
y1 = -term1 + 2.0*r13;
}
else
{
q = -q;
dum1 = q*q*q;
dum1 = Math.acos(r/Math.sqrt(dum1));
r13 = 2.0*Math.sqrt(q);
y1 = -term1 + r13*Math.cos(dum1/3.0);
}
}
// 确定了y1 分解立方的实根
term1 = b/4.0;
sqR = -c + term1*b + y1;
RRe = RIm = DRe = DIm = ERe = EIm = z1Re = z1Im = z2Re = 0;
if (sqR >= 0)
{
if (sqR == 0)
{
dum1 = -(4.0*e) + y1*y1;
if (dum1 < 0){
z1Im = 2.0*Math.sqrt(-dum1);
} else {
z1Re = 2.0*Math.sqrt(dum1);
z2Re = -z1Re;
}
}
else
{
RRe = Math.sqrt(sqR);
z1Re = -(8.0*d + b*b*b)/4.0 + b*c;
z1Re /= RRe;
z2Re = -z1Re;
}
}
else
{
RIm = Math.sqrt(-sqR);
z1Im = -(8.0*d + b*b*b)/4.0 + b*c;
z1Im /= RIm;
z1Im = -z1Im;
}
z1Re += -(2.0*c + sqR) + 3.0*b*term1;
z2Re += -(2.0*c + sqR) + 3.0*b*term1;
//At this point, z1 and z2 should be the terms under the square root for D and E
if (z1Im == 0)
{ // Both z1 and z2 real
if (z1Re >= 0)
{
DRe = Math.sqrt(z1Re);
}
else
{
DIm = Math.sqrt(-z1Re);
}
if (z2Re >= 0)
{
ERe = Math.sqrt(z2Re);
}
else
{
EIm = Math.sqrt(-z2Re);
}
}
else
{
r = Math.sqrt(z1Re*z1Re + z1Im*z1Im);
r = Math.sqrt(r);
dum1 = Math.atan2(z1Im, z1Re);
dum1 /= 2; //Divide this angle by 2
ERe = DRe = r*Math.cos(dum1);
DIm = r*Math.sin(dum1);
EIm = -DIm;
}
dataForm.x1Re.value = -term1 + (RRe + DRe)/2;
dataForm.x1Im.value = (RIm + DIm)/2;
dataForm.x2Re.value = -(term1 + DRe/2) + RRe/2;
dataForm.x2Im.value = (-DIm + RIm)/2;
dataForm.x3Re.value = -(term1 + RRe/2) + ERe/2;
dataForm.x3Im.value = (-RIm + EIm)/2;
dataForm.x4Re.value = -(term1 + (RRe + ERe)/2);
dataForm.x4Im.value = -(RIm + EIm)/2;
return;
}
</script>
</body>
</html>
Thank you for sharing your thoughts. I really appreciate your efforts and I will be waiting for your further write ups thanks once again.
An outstanding share! I’ve just forwarded this onto a coworker who was doing a little homework on this.
And he actually ordered me dinner simply because
I found it for him… lol. So let me reword this….
Thank YOU for the meal!! But yeah, thanks for spending
the time to talk about this subject here on your site.
My brother recommended I may like this web site.
He was once totally right. This submit truly made my day.
You can not imagine just how a lot time I had spent for this info!
Thanks!
Everyone loves it when folks get together and share opinions.
Great blog, keep it up!
Saved as a favorite, I really like your site!