Консультация № 174097
09.11.2009, 16:31
35.00 руб.
0 6 3
Составить подпрограмму-функцию для вычисления приближенного значения гиперболического тангенса по формуле
th(x)=([$8721$]20k=0(x2k+1)\((2k+1)!))\([$8721$]20k=1((x2k)\(2k)!))
исспользуя данную подпрограмму написать программу вычесления функции
y(x)=(2th(0.5)-3th(x-0.1))\(5-th(4x-1)) ув. эксперты помогите пожалуйста

Обсуждение

Неизвестный
09.11.2009, 17:26
общий
это ответ
Здравствуйте, Кусмарцев Андрей Валерьевич.
Программы в приложении. В функции отдельно вычисляется числитель и знаменатель, после чего функции присваивается значение частного

Приложение:
Program p1;
var x,y:real;

function th(x:real):real;
var s1,s2:extended;
i:integer;
sxk,fk:extended;
begin
sxk:=x; fk:=1; s1:=0;
for i:=0 to 20 do
begin
s1:=s1+sxk/fk;
sxk:=sxk*sqr(x);
fk:=fk*(i*2+2)*(i*2+3);
end;

sxk:=sqr(x); fk:=2; s2:=0;
for i:=1 to 20 do
begin
s2:=s2+sxk/fk;
sxk:=sxk*sqr(x);
fk:=fk*(i*2+1)*(i*2+2);
end;

th:=s1/s2;
end;

begin
write('x='); readln(x);
y:=(2*th(0.5)-3*th(x-0.1))/(5-th(4*x-1));
writeln(y);
readln;
end.
давно
Специалист
246813
155
09.11.2009, 17:29
общий
09.11.2009, 21:17
это ответ
Здравствуйте, Кусмарцев Андрей Валерьевич.
Комментарии в программе.
Код:

program q174097;
const n=20;
var k:integer;
x,y:real;

function th(x:real):real;{Начало функции}
var ch,zn:real;{Числитель и знаменатель гиперболического тангенса(th)}
ch1,ch2:real;{Числители числителей th}
zn1,zn2:integer;{Знаменатели знаменателей th}
begin
ch:=x; ch1:=x; ch2:=1; zn:=0; zn1:=1; zn2:=1;
for k:=1 to n do
begin

ch1:=ch1*x*x; {Вычисляем числитель числителя th}
zn1:=zn1*(2*k)*(2*k+1); {Вычисляем знаменатель числителя th}
ch:=ch+ch1/zn1; {Вычисляем числитель th}

ch2:=ch2*x*x; {Вычисляем числитель знаменателя th}
zn2:=zn2*(2*k-1)*(2*k); {Вычисляем знаменатель знаменателя th}
zn:=zn+ch2/zn2; {Вычисляем знаменатель th}

th:=ch/zn; {Гиперболический тангенс}

end;
end;{Конец функции}

begin
Write('Введите х:');
Readln(x);
y:=(2*th(0.5)-3*th(x-0.1))/(5-th(4*x-1));
WriteLn('y(x)=',y:1:4);
ReadLn;
end.
давно
Модератор
156417
2175
09.11.2009, 17:50
общий
это ответ
Здравствуйте, Кусмарцев Андрей Валерьевич.
В данном варианте решения числитель и знаменатель рассчитываются в одном цикле.

Приложение:

function th(x:real):real;
var
k: integer;
S1,S2,xnf: real;
begin

S2:=0; //исходные значения
{k=0}
xnf:=x; //первый член суммы в числителе
S1:=xnf;

{k=1..20}
for k:=1 to 20 do
begin
xnf:=xnf*x/(2*k); {x^(2k)/(2k)!}
S2:=S2+xnf; //сумма в знаменателе

xnf:=xnf*x/(2*k+1); {x^(2k+1)/(2k+1)!}
S1:=S1+xnf; //сумма в числителе
end;

th:=S1/S2;
end;

var x:real;

begin
write('input x= ');
readln(x);
writeln('y= ',((2*th(0.5)-3*th(x-0.1))/(5-th(4*x-1))):8:5);
readln;
end.
давно
Модератор
156417
2175
09.11.2009, 19:26
общий
LfiN:
Вы свою программу на работоспособност проверяли?
Код:
zn1,zn2:integer;{Знаменатели знаменателей th}

Такой факториал в integer в жизни не поместится (у ТурбоПаскаля он даже в real не очень влазит )
давно
Специалист
246813
155
09.11.2009, 21:08
общий
Химик CH:
Благодарю за замечание. В программе исправил, а сюда из блокнота неисправленный текст вставил.
давно
Специалист
246813
155
09.11.2009, 21:08
общий
Модераторы:
Прошу исправить мой ответ на такой
Код:
program q174097;
const n=20;
var k:integer;
x,y:real;

function th(x:real):real;{Начало функции}
var ch,zn:real;{Числитель и знаменатель гиперболического тангенса(th)}
ch1,ch2:real;{Числители числителей th}
zn1,zn2:integer;{Знаменатели знаменателей th}
begin
ch:=x; ch1:=x; ch2:=1; zn:=0; zn1:=1; zn2:=1;
for k:=1 to n do
begin

ch1:=ch1*x*x; {Вычисляем числитель числителя th}
zn1:=zn1*(2*k)*(2*k+1); {Вычисляем знаменатель числителя th}
ch:=ch+ch1/zn1; {Вычисляем числитель th}

ch2:=ch2*x*x; {Вычисляем числитель знаменателя th}
zn2:=zn2*(2*k-1)*(2*k); {Вычисляем знаменатель знаменателя th}
zn:=zn+ch2/zn2; {Вычисляем знаменатель th}

th:=ch/zn; {Гиперболический тангенс}

end;
end;{Конец функции}

begin
Write('Введите х:');
Readln(x);
y:=(2*th(0.5)-3*th(x-0.1))/(5-th(4*x-1));
WriteLn('y(x)=',y:1:4);
ReadLn;
end.
Форма ответа