获得pascal中二次多项式的复根

时间:2015-12-11 09:29:45

标签: pascal complex-numbers

我必须在pascal中编写一个程序,给定多项式的三个系数(ax²+ bx + c),输出它的根。

这就是我现在所拥有的:

List<Customer>

它适用于真正的根,但我不知道如何使它适用于复杂的数字。

1 个答案:

答案 0 :(得分:1)

我假设你的系数是真实的数字(用户不能输入复数作为系数)。这将为问题增加一个全新的复杂程度(没有双关语)。

您需要检查判别(square(p.b)) - (4 * p.a * p.c))以查看它是否小于0.目前,您的代码只是,sqrt((square(p.b)) - (4 * p.a * p.c))但您不是&{ #39;检查你是否采用负数的平方根(你不能使用Pascal sqrt库函数)。

如果判别式为负,那么您有一个复杂的根,您可以在程序中根据需要分离实部和虚部。这是基本的quadratic formula

例如:

procedure roots (p : polynomial; var rP, rN : real);
var disc: real;
  begin
    disc := square(p.b) - 4*p.a*p.c;

    if disc >= 0 then begin
      rP := (-p.b + sqrt(disc)) / (2 * p.a); 
      rN := (-p.b - sqrt(disc)) / (2 * p.a);

      writeln('The roots are: ', rP:0:3, ' y ' ,rN:0:3);
    end
    else begin
       // Roots are:
       //   -p.b/(2*p.a) + (sqrt(-disc)/(2*p.a))i
       //   -p.b/(2*p.a) - (sqrt(-disc)/(2*p.a))i
    end
  end;

在这里,您使用sqrt(x)如果x为否定的事实,(sqrt(-x))i其中isqrt(-1)。请注意,您还可以拆分disc = 0案例以避免重复双根

由于您的roots功能打印出结果,而您的主程序没有使用返回的参数rNrP,因此我不清楚你需要传回根源。但是如果想要将根作为参数传递(你现在设计的功能的方式),我会把它作为练习。您只需要决定复杂根的表示。一种方法是使用Complex数字类型作为结果(如果您的编译器库支持它们),并且当结果是真实的时,虚部将只为零。或者,如果您需要创建自己的,只需创建type record,其中包含真实虚构部分。

type complex = record
  re: real;
  im: real;
end;