IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Комплексные числа, нахождение косинуса
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской
Реальное имя: valera

Репутация: -  0  +


Помогите закончить задачу

Пусть даны комплексное число z (пара вещественных чисел) и вещественное число Эпсилон > 0. Вычислить с точностью Эпсилон значение следующей комплексной функции:
cos z = z – z^2 /2! + z^4 /4! - … + (-1)^n z^2n /(2n)! + …
^ - это степень

program ComplexCos;

type
complex = record
re, im: real

end;
var
Eps: real;
z, res:Complex;

{Функция для определения модуля комплексного числа}
function AbsComplex(z: Complex): real;
begin
AbsComplex := sqrt(str(z.re) + sqr(z. im))
end;

{Процедура сложения двух комплексных чисел}
procedure AddComplex(z1,z2: Complex; var res:Complex);
begin
res.re := z1.re + z2.re;
res.im := z1.im + z2.im;
end;

{процедура умножения двух комплексных чисел}
procedure Multicomplex(z1,z2: Complex; var res:Complex);
begin
res.re := z1.re * z2.re - z1.im * z2.im;
res.im := z1.re * z2.im - z1.im * z2.re
end;

{Процедура деления комплексного числа на вещественное}
procedure DivCoplToReal(var z:Complex; c:real);
begin
if c < ??????????????
then writeln ('На ноль делить нельзя')
else
begin
z.re := z.re / c;
z.im := z.im / c
end
end;

{Процедура вычисления косинуса}
???????????????????????
???????????????????????

end;

begin
{Ввод комплексного числа z}
writeln('Введите комплексное число');
write ('Вещественная часть: ');
readln (z.re);
write ('Комплексная часть: ');
readln (z.im);

{Ввод точности вычеслений}
writeln ('Введите Eps - точность вычеслений' , '(Eps>0)');
repeat
write('Eps=');
readln (Eps);
if Eps <=0 then
writeln('Неправильно.Повторите ввод.');
until (Eps>0);

{Вычисление косинуса}
?????????????
?????????????

{Вывод результатов}
write ('Комплексное число равно', res.re:5:2);
if res.im>=0 then wtite ('+');
write(res.im:5:2, '*i');
readln
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Значит, так... Вот рабочая программа для вычисления значения Cos(z) комплексного аргумента разложением в ряд:
Program ZnachCos;

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

procedure GetComplex(var cplx: Complex);
begin
write('(re) part: '); readln(cplx.re);
write('(im) part: '); readln(cplx.im);
end;
procedure PutComplex(var cplx: Complex);
const sign: array[boolean] of char = ('+', '-');
begin
write('(', cplx.re:7:4, sign[cplx.im < 0], abs(cplx.im):7:4, '*i');
end;

function AbsComplex(z: Complex): real;
begin
AbsComplex := sqrt(sqr(z.re) + sqr(z.im))
end;

procedure AddComplex(z1,z2: Complex; var res:Complex);
begin
res.re := z1.re + z2.re;
res.im := z1.im + z2.im;
end;

procedure Multicomplex(z1,z2: Complex; var res:Complex);
begin
res.re := z1.re * z2.re - z1.im * z2.im;
res.im := z1.re * z2.im + z1.im * z2.re;
end;
procedure ScaleComplex(var z:Complex; c:real);
begin
z.re := z.re * c;
z.im := z.im * c
end;

Var
n,k:Integer;
b,e,p,Eps:real;
z, a, s, sq: complex;
Begin
writeln('complex Z = '); GetComplex(z);
Write('real Eps = '); Readln(Eps);

n := 2;
a.re := 1; a.im := 0;
s.re := 1; s.im := 0;
MultiComplex(z, z, sq);
While AbsComplex(a) > Eps do Begin
MultiComplex(a, sq, a);
ScaleComplex(a, - 1 / (pred(n) * n));
AddComplex(s, a, s);
Inc(n, 2)
End;
Writeln('COS(z) = '); PutComplex(s);
End.


Теперь - разбор твоих ошибок (может, еще кому интересно будет)... Первая твоя ошибка - в формуле. Правильное разложение косинуса:
cos z = 1 – z^2 /2! + z^4 /4! - … ,
а не z как у тебя...

Вторая - в реализации операции умножения комплексных чисел... Ты поставил знак "-" вместо нужного плюса:
procedure Multicomplex(z1,z2: Complex; var res:Complex);
begin
res.re := z1.re * z2.re - z1.im * z2.im;
res.im := z1.re * z2.im + z1.im * z2.re; { <--- Здесь у тебя был МИНУС }
end;


Ну, и третье - смотри свою реализацию в repeat ... until, и мою в while. Как говорится, найди 10 отличий...

Проверялось на Z = (2, 1)
при Eps = 0.001
Ответ совпадает с тем, что получено на С++ с использованием <complex.h>
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 8:12
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name