查看: 1291|回复: 6|关注: 0

[已解决] 如何用matlab求一元三次方程的最小正根?

[复制链接]

入门

52 麦片

财富积分


50500


3

主题

14

帖子

0

最佳答案
本帖最后由 smile012 于 2019-1-10 14:01 编辑

以下是我用范圣金公式求一元三次方程的步骤,运行是对的,(这个仅供参考不是问题的主要内容,大佬们无需改这个程序),重点是:然后我想在后面加上判断三个根中的最小正根的步骤,越简单越好,请问该怎么编译呢???

function x = fanshengjin_Solve3Polynomial(a, b, c, d)
% 范盛金. 一元三次方程的新求根公式与新判别法[J]. 海南师范学院学报,1989,2(2):91-98.
A = b*b - 3*a*c;   if abs(A) < 1e-14;    A = 0;  end
B = b*c - 9*a*d;   if abs(B) < 1e-14;    B = 0;  end
C = c*c - 3*b*d;   if abs(C) < 1e-14;    C = 0;  end  
DET = B*B - 4*A*C; if abs(DET) < 1e-14;  DET = 0;  end  
  if (A == 0) && (B == 0)  %三重实根
    x1 = -c/b;      x2 = x1 ;    x3 = x1;
  else
      if DET > 0      %一个实根,一对共轭负根
     Y1 = A*b + 1.5*a*(-B + sqrt(DET));
     Y2 = A*b + 1.5*a*(-B - sqrt(DET));
     y1 = nthroot(Y1,3);  y2 = nthroot(Y2,3);
     x1 = (-b-y1-y2)/(3*a);
     vec1 = (-b + 0.5*(y1 + y2))/(3*a);  
     vec2 = 0.5*sqrt(3)*(y1 - y2)/(3*a);
     x2 = complex(vec1, vec2);
     x3 = complex(vec1, -vec2);
     clear Y1 Y2 y1 y2 vec1 vec2;
     elseif DET == 0 && (A ~= 0) && (B ~= 0)  %三个实根,一对二重根
     K = (b*c-9*a*d)/(b*b - 3*a*c); K = round(K,14);
     x1 = -b/a + K;   x2 = -0.5*K;   x3 = x2;
     else    %DET < 0    %三个不相等的实根
     sqA = sqrt(A);
     T = (A*b - 1.5*a*B)/(A*sqA);
     theta = acos(T);
     csth  = cos(theta/3);
     sn3th = sqrt(3)*sin(theta/3);
     x1 = (-b - 2*sqA*csth)/(3*a);
     x2 = (-b + sqA*(csth + sn3th))/(3*a);
     x3 = (-b + sqA*(csth - sn3th))/(3*a);
     clear sqA T theta csth sn3th;
     end
  end
x = [x1;  x2;  x3];

论坛优秀回答者

入门

472 麦片

财富积分


50500


3

主题

810

帖子

92

最佳答案
  • 关注者: 70
发表于 2019-1-10 14:27:18 | 显示全部楼层 |此回复为最佳答案
本帖最后由 coolchen302 于 2019-1-10 14:28 编辑

temp=x(real(x)>0);
result=min(temp);
你的根里有复数,所以你的问题可能要扩展一下
或者你自己来改一下

入门

52 麦片

财富积分


50500


3

主题

14

帖子

0

最佳答案
 楼主| 发表于 2019-1-10 14:34:47 | 显示全部楼层
非常感谢!只是我是个新手菜鸡,不明白要怎么扩展啊。。。。把real改成complex吗?

论坛优秀回答者

入门

472 麦片

财富积分


50500


3

主题

810

帖子

92

最佳答案
  • 关注者: 70
发表于 2019-1-11 08:33:38 | 显示全部楼层
smile012 发表于 2019-1-10 14:34
非常感谢!只是我是个新手菜鸡,不明白要怎么扩展啊。。。。把real改成complex吗? ...

如果是复数的话,怎么确定“最小正根”,是实部还是虚部?
real(),取实部,imag()取虚部,abs()取模
你自己视情况调整吧~

入门

52 麦片

财富积分


50500


3

主题

14

帖子

0

最佳答案
 楼主| 发表于 2019-1-11 11:40:47 | 显示全部楼层
我想排除复数,只取有理数怎么调整呢

入门

52 麦片

财富积分


50500


3

主题

14

帖子

0

最佳答案
 楼主| 发表于 2019-1-13 17:18:13 | 显示全部楼层
coolchen302 发表于 2019-1-11 08:33
如果是复数的话,怎么确定“最小正根”,是实部还是虚部?
real(),取实部,imag()取虚部,abs()取模
你 ...

我想排除复数,只取有理数怎么调整呢

论坛优秀回答者

入门

472 麦片

财富积分


50500


3

主题

810

帖子

92

最佳答案
  • 关注者: 70
发表于 2019-1-13 20:42:39 | 显示全部楼层
smile012 发表于 2019-1-13 17:18
我想排除复数,只取有理数怎么调整呢

用is~指令吧
iscomplex?,需要查一下,把复数给剔除掉
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

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