获得帕斯卡二次多项式的复根

Obtaining the complex roots of a 2nd degree polynomial in pascal

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

这是我现在拥有的:

program poly;

type
    polynomial = record
                 a, b, c : real;
                end;

procedure readPolynomial (var p : polynomial);
      begin
        writeln ('Input 1st coefficient: ');
        readln (p.a);

        writeln ('Input 2nd coefficient: ');
        readln (p.b);

        writeln ('Input 3rd coefficient: ');
        readln (p.c);
      end;


function square (x : real) : real;
     begin
        square := x * x; 
     end;

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

        writeln('The roots are: ', rP:0:3, ' y ' ,rN:0:3);
      end;

var
myPolynomial : polynomial;
r1, r2      : real;

begin
    writeln ('Enter the coefficients: ');
    readPolynomial (myPolynomial);

    roots (myPolynomial, r1, r2);

end.

它适用于实根,但我不知道如何让它适用于复数。

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

您需要检查 判别式 ((square(p.b)) - (4 * p.a * p.c)) 以查看它是否小于 0。目前,您的代码确实如此,sqrt((square(p.b)) - (4 * p.a * p.c)) 但是您不检查您是否正在计算负数的平方根(使用 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 案例以避免重复 double root.

因为你的 roots 函数打印出结果并且你的主程序不使用返回的参数 rNrP,我不清楚你是否需要传递根本回根。但是如果想将根作为参数传回(您当前设计函数的方式),我将把它留作练习。您只需要决定复杂根的表示。一种方法是对结果使用 Complex 数字类型(如果您的编译器库支持它们),当结果为实数时,虚部将为零。或者,如果您需要创建自己的,只需创建一个 type,它是一个由 realimaginary[=45 组成的 record =]部分。

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