вычисление комплексной функции ch z, не понимаю как такое делать нужно(турбо паскаль)

FasterHarder
Дата: 07.12.2007 16:56:13
I started in 1983, in 2007 i still on a case!

Всем программистам привет! Respect! Вот столкнулся с физическим непониманием как сделать такую задачку:
"Даны комплексное число z(пара вещественных чисел) и вещественное число ε > 0. Вычислить с точностью ε значение следующей комплексной функции:
ch z = 1 + z²/2! + (z²*z²)/4! + … + (z в степени 2n)/ (2n)! + …"
сh(гиперболический косинус, никакого как я понял к этому делу отношения не имеет).
Вроде знаю что такое комплексные числа, какие операции над ними допустимы и все такое, а стал делать и застопорился. Посмотрите пожалуйста текст проги, может какую нить идею подкините, буду бесконечно благодарен:
program complex_p(input, output);
{$N+}
uses
	crt;
type
	TComplex = record
		re : extended;	{действительная часть числа}
		im : extended;	{мнимая часть числа}
	end;
var
	complex, tempComplex : TComplex;
	eps : real;		{точность расчета}
	sel : byte;		{при выборе чего либо}
	hyperCosinus : extended;	{расчитываемая функция}
	currentMember : extended;	{текущий член ряда}
	factorial : longint;
	pow : integer;
	i : integer;
{==============================================================}
procedure powerComplex(x : TComplex; power : integer; var y : TComplex);
var
st : integer;
res : TComplex;
begin
	res.re := 1;
	res.im := 1;
	st := 1;
	for st := 1 to round(power / 2) do
	begin
		res.re := res.re * (sqr(x.re) - sqr(x.im));
		res.im := res.im * 2 * x.re * x.im;
	end;
{	powerComplex := sqr(res.re) + sqr(res.im);}
	y := res;
end;
{==============================================================}
begin
	clrscr;			{очистка от прошлых выводов}

	writeln('Введите действительную часть комплексного числа: ');
	readln(complex.re);
	writeln('Введите мнимую часть комплексного числа: ');
	readln(complex.im);
	writeln('Работаем с комплексным числом z, имеющим математическое представление: ');
	writeln('z = ',complex.re:4:2, ' + ', complex.im:4:2, ' * i');

	writeln;
	writeln('Выберите точность расчета: ');
	writeln('При выборе не существующего варианта, будет принята точность 0.01');
	writeln('1 - 0.1');
	writeln('2 - 0.01');
	writeln('3 - 0.001');
	writeln('4 - 0.0001');
	readln(sel);

	case sel of
	1:	eps := 0.1;
	2:	eps := 0.01;
	3:	eps := 0.001;
	4:	eps := 0.0001;
	else
		eps := 0.01;
	end;

	currentMember := 1;
	hyperCosinus := 1;
	pow := 2;
	factorial := 1;
	while(currentMember >= sqr(eps)) do
	begin
		for i := 1 to pow do
		begin
			factorial := factorial * i;
		end;
{		currentMember := powerComplex(complex, pow);}
		powerComplex(complex, pow, tempComplex);

		tempComplex.re := tempComplex.re / factorial;
		tempComplex.im := tempComplex.im / factorial;

		currentMember := sqr(tempComplex.re) + sqr(tempComplex.im);

{		complex := powerComplex(complex, pow);}
		hyperCosinus := hyperCosinus + currentMember / factorial;
		pow := pow * 2;
		factorial := 1;
	end;

	writeln;
	writeln('Значение комплексной функции равно: ');
	writeln(hyperCosinus:6:5);
	readln;			{задержка выполнения программы}
end.

подскажите как быть то?
TakZaglanul
Дата: 08.12.2007 15:25:14
Ну когда же ты научишся работать с рядами? Ведь намного быстрее, точнее и легче вычислять следующий член ряда на основе текущего. В твоем случае это будет примерно так:
....
var
....
   currentMember, hyperCosinus: tComplex; {а не Extended, как у тебя}
   i:integer; {Счетчик слагаемых}

procedure ComplexMul(z1,z2:tComplex; var r:tComplex);
begin
  {Надеюсь, умножение комплексных чисел сам сможешь написать}
end;

procedure ComplexAdd(z1,z2:tComplex; var r:tComplex);
begin
  {А уж сложение - тем более}
end;

function ComplexAbs(z:tComplex):double;
begin
  {Еще нам потребуется модуль комплесного числа}
  ComplexAbs:= Sqrt(sqr(z.re)+sqr(z.im));
end;

Begin
  .....
  ComplexMul(complex, comlex, complex); {Все равно в ряду присутствует только в четных степенях}
  {поэтому сразу и возведем введенное число в квадрат}
  currentMember.re := 1; CurrentMember.im:=0;
  hyperCosinus.re := 0; hyperCosinus.im := 0;
  i:=0;
  While  ComplexAbs(CurrentMember)>= sqr(eps) do
  begin
    ComplexAdd(HyperCosinus,CurrentMember,HyherCosinus);
    Complexmul(currentMember, complex, currentmemeber); {домножили текущий член на z^2}
    i:=i+1;
    CurrentMember.re:=CurrentMember.re/((2*i-1)*(2*i)); {и доделили на увеличение факториала}
  end;
  ...
end.
TakZaglanul
Дата: 08.12.2007 15:28:22
Упс, забыл еще мнимую часть CurrentMember разделить на ((2*i-1)*(2*i))
FasterHarder
Дата: 10.12.2007 16:09:12
I started in 1983, in 2007 i still on a case!
спасибо большое за объяснение, сделал так:
program complex_01(input, output);
uses
	crt;
type
	TComplex = record
		re : real;	{действительная часть числа}
		im : real;      {мнимая часть числа}
	end;
var
	complex : TComplex;
	currentMember : TComplex;	{текущий член ряда}
	hyperCosinus : TComplex;	{хранит значение функции}
	i : integer;			{счетчик слагаемых}
	sel : byte;
	eps : real;
{============================================================}
{вычисляем произведение двух комплексных чисел}
procedure complexMult(z1, z2 : TComplex; var res : TComplex);
begin
	res.re := z1.re * z2.re - z1.im * z2.im;
	res.im := z1.re * z2.im + z1.im * z2.re;
end;
{============================================================}
{вычисляем сумму двух комплексных чисел}
procedure complexAdd(z1, z2 : TComplex; var res : TComplex);
begin
	res.re := z1.re + z2.re;
	res.im := z1.im + z2.im;
end;
{============================================================}
{вычисляем модуль комплексного числа}
function complexAbs(z : TComplex) : real;
begin
	complexAbs := sqrt(sqr(z.re) + sqr(z.im));
end;
{============================================================}
begin
	clrscr;		{очистка экрана от прошлых выводов}

	writeln('Введите действительную часть комплексного числа: ');
	readln(complex.re);
	writeln('Введите мнимую часть комплексного числа: ');
	readln(complex.im);
	writeln('Работаем с комплексным числом z, имеющим математическое представление: ');
	writeln('z = ',complex.re:4:2, ' + ', complex.im:4:2, ' * i');

	writeln;
	writeln('Выберите точность расчета: ');
	writeln('При выборе не существующего варианта, будет принята точность 0.01');
	writeln('1 - 0.1');
	writeln('2 - 0.01');
	writeln('3 - 0.001');
	writeln('4 - 0.0001');
	readln(sel);

	case sel of
	1:	eps := 0.1;
	2:	eps := 0.01;
	3:	eps := 0.001;
	4:	eps := 0.0001;
	else
		eps := 0.01;
	end;

	complexMult(complex, complex, complex);

	currentMember.re := 1;
	currentMember.im := 0;
	hyperCosinus.re := 0;
	hyperCosinus.im := 0;
	i := 0;

	while(complexAbs(currentMember) >= sqr(eps)) do
	begin
		complexAdd(hyperCosinus, currentMember, hyperCosinus);
		complexMult(currentMember, complex, currentMember);
		inc(i);
		currentMember.re := currentMember.re / ( (2 * i - 1) * (2 * i) );
		currentMember.im := currentMember.im / ( (2 * i - 1) * (2 * i) );
	end;

	writeln;
	writeln('Значение комплексной функции равно: ');
	writeln(complexAbs(hyperCosinus):10:10);

	readln;		{задержка выполнения программы}
end.
но цель задания вычислить значение функции, т е в данном случае hyperCosinus. В итоге я вывожу ее абсолютное значение, а может что то другое необходимо. Подскажите как быть то?
S.G.
Дата: 10.12.2007 19:24:08
FasterHarder

но цель задания вычислить значение функции, т е в данном случае hyperCosinus. В итоге я вывожу ее абсолютное значение, а может что то другое необходимо. Подскажите как быть то?
Ну выведи комплексное значение.
FasterHarder
Дата: 10.12.2007 19:50:35
I started in 1983, in 2007 i still on a case!
да, правильно вы говорите. Так и сделал. Top close.