Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2009, 11:09   #1
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию комплексные числа в списках на pascal

Добрый день.... Я написал программу, которая с точностью EPS значение следующей комплексной функции:
E^Z=1+Z/1!+Z^2/2!+Z^3/3!+...+Z^N/N!
Вот исходный код:
Код:

program zad14;


{
Даны комплексное число Z(пара вещественных чисел) и вещественное число
EPS>0.Вычислить с точностью EPS значение следующей комплексной функции
 E^Z=1+Z/1!+Z^2/2!+Z^3/3!+...+Z^N/N!

Берем конкетное Z и конкретное n. Считаем по формуле e в степени z
для n и для n+1. Находим модуль разности двух найденных значений.
Если он<Eps, то считем, что точность достигнута и записываем в ответ
каждое из значений. Если нет, то увеличивем n на 1 и повторяем процедуру.
}

{запись описывающая комплексное число}
type
    Complex = record
            x, y: Real;
    end;

{Печать комплексного числа}
procedure ComplexPrint(Z: Complex);
begin
     write(Z.x:2:2, '+',Z.y:2:2,'i');
end;

{Модуль разности двух комплексных чисел}
function ComplexSubMod(var E1, E2 : Complex):Real;
Begin
    ComplexSubMod := sqrt(sqr((E1.x - E2.x)) + sqr((E1.y - E2.y)));
End;

{Умножение комплексных чисел}
procedure ComplexMul(var E1, E2: Complex; var Res: Complex);
begin
   res.x := E1.x * E2.x - E1.y * E2.y;
   res.y := E1.y * E2.x + E1.x * E2.y;
end;

{Деление комплексного на вещественное}
procedure ComplexDivReal(Z: Complex;  N: integer; var Res:Complex);
begin

     Z.x := Z.x/N;
     Z.y := Z.y/N;
     Res := Z;
end;

{Сложение комплексных чисел}
procedure ComplexSum(var E1, E2: Complex; var Res:Complex);
begin
     E1.x := E1.x + E2.x;
     E1.y := E1.y + E2.y;
     Res:= E1;
end;

{Возведение комплексного числа в степень}
procedure ComplexPower(E : Complex; exp: Integer; var Res:Complex);
Var
   i: integer;
begin
   Res := E;
   for i:= 2 to Exp do
   begin
       ComplexMul(Res,E,Res);
   end;
end;

{Вычисление факториала}
function Factorial(var N : Integer):integer;
Var
   res: integer;
   i  : integer;
begin
     if N <= 1 Then Factorial := 1;
     res := 1;
     for i := 2 to N do
         res := res * i;
     Factorial := res;
end;


procedure InputComplexNumberAndEps(var Z:complex;var EPS:real);
begin
   Write('Введите Z (x[пробел]y) => ');
   readln(Z.x, Z.y);
   Write('Введеное число ');
   ComplexPrint(Z);
   Writeln;
   Write('Введите EPS =>  ');
   Readln(EPS);
end;
 {Дальше работает так:
    Вычисляем E^Z для 1 (E1) и для 2 (E2). Если модуль разности устраивает
    нас по точности, выводим и выходим. Инече делаем N:=N+1, E1:=E2,
    E2:=E2+Z^N/N! и повторяем сравнение }
procedure ModuleDifference(var E1,E2,Z:complex;EPS:real;N:integer);
begin
   N := 2;
   ComplexDivReal(Z,1,E1); { факториал 1 равен 1}
   ComplexPower(Z,2,E2);
   ComplexDivReal(E2, Factorial(N), E2);
   ComplexSum(E1, E2, E2);
   While ComplexSubMod(E1, E2) > EPS do
   begin
         E1 := E2;
         Inc(N);
         ComplexPower(Z,N,E2);
         ComplexDivReal(E2, Factorial(N), E2);
         ComplexSum(E1, E2, E2);
   end;
end;
procedure OutputComplexNumberAndEps(E1,E2:Complex);
begin
   Writeln('Точность достигнута');
   Write(' E1 = ');
   ComplexPrint(E1);
   Writeln; Write(' E2 = ');
   ComplexPrint(E2);
   Writeln;
   Writeln('|E1-E2| = ', ComplexSubMod(E1, E2):3:3);
   Write('Нажмите ввод');
   readln;
end;
var
   {Два комплексных значения функции}
   Z      : Complex; {Нужное Z}
   E1, E2 : Complex; {Комплексные числа - значения функции}
   EPS : Real;    { Точность }
   N   : integer; {Текущее количество членов}

begin
InputComplexNumberAndEps(Z,EPS);
ModuleDifference(E1,E2,Z,eps,N);
OutputComplexNumberAndEps(E1,E2);
end.
Проблема в том, что она не правильно считает.
Если задается комплексное число вида: 1+2i, то точность вычисления должна быть 0,055, а Е1 = -2,12+2,41, а E2 = -2,12+2,47i.
Помогите исправить пожалуйста программу
world12_tk вне форума Ответить с цитированием
Старый 27.03.2009, 16:35   #2
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Как насчет пользоваться формулой Муавра при возведении в степень? У тебя насколько я вижу не так... хотя не особо вникал..
Uguu~
__STDC__ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Комплексные числа в паскале селюк Помощь студентам 6 26.05.2010 22:35
Комплексные числа shtuceron Помощь студентам 2 21.01.2010 23:47
Комплексные числа 777UFO777 Общие вопросы Delphi 0 21.12.2008 23:48
записи и комплексные числа ZhekON Паскаль, Turbo Pascal, PascalABC.NET 4 23.05.2008 15:57
Большие комплексные числа xoz Общие вопросы Delphi 0 24.02.2008 03:12