2015-12-11 2 views
0

Мне нужно закодировать программу в паскале, которая, учитывая три коэффициента полинома (ax² + bx + c), выводит свои корни.Получение комплексных корней полинома второй степени в pascal

Вот что я прямо сейчас:

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. 

Он отлично работает для реальных корней, но я не знаю, как заставить его работать с комплексными числами.

+1

Вы имеете в виду комплексные коэффициенты a, b, c? Или вы хотите обработать случай с реальными коэффициентами и отрицательным дискриминантом? В этом случае смотрите здесь: https://en.wikipedia.org/wiki/Quadratic_equation#Discriminant – gammatester

+0

Люди будут часто задавать уточняющие вопросы вскоре после того, как вопрос будет опубликован, поэтому неплохо остаться на сайте на некоторое время и посмотреть для этих вопросов. В противном случае ваш вопрос может быть опущен и/или закрыт. –

ответ

1

Я принимаю ваши коэффициенты действительные цифры (они не могут вводить комплексные числа в виде коэффициентов). Это добавило бы новый уровень сложности (не каламбур) к проблеме.

Вы должны проверить дискриминант ((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 где i является sqrt(-1). Обратите внимание, что вы также можете разделить корпус disc = 0, чтобы избежать повторения двойного корня .

Поскольку ваши roots функция выводит результаты и основной программы не использует возвращенные аргументы rN и rP, это не ясно мне, если вам нужно передать обратно корни на всех. Но если вы хотите передать корни в качестве аргументов (как у вас есть ваша функция в настоящее время), я оставлю это как упражнение. Вам просто нужно принять решение о представлении сложных корней. Один из способов - использовать тип номера Complex для результатов (если ваша библиотека компилятора поддерживает их), а когда результаты реальны, мнимая часть будет равна нулю. В качестве альтернативы, если вам нужно создать свой собственный, просто сделайте type, который является record, состоящим из реальных и мнимой.

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

 Смежные вопросы

  • Нет связанных вопросов^_^