Версия для печати темы
Образовательный студенческий форум _ Информатика / Программирование _ программа по вичислению рядов в паскале
Автор: otherside 1.4.2008, 15:05
подскажите пожалуйста как сделать, нужно в паскале написать программу, которая бы высчитывала значения функций y=(1/2)*ln{(1+x)/(1-x)} и s=x+(x^3)/3+(x^5)/5+(x^7)/7 при x{0,2;0.8} с шагом dx=0,2. после всех вычислений программа должна сравнить значения у и s, так чтобы разница между ними не превышала 0,01, и если такое значение получилось, то программа должна вывести то значение х при котором погрешность равна 0,01. я так поняла что s это сумма {x^(2n-1)}/2n-1
Автор: creer 1.4.2008, 16:37
Вначале несложно, степень можно вычислить через логарифм и экспоненту.
s, да это первые 4 члена данного ряда. Это примерно равно ряду при достаточно малых x. При 0,8 погрешность больше 0,01.
Сама сумма ряда равна y.
Нужно найти такое значение x при котором погрешность между s и y была точно равна 0,01?
Автор: otherside 1.4.2008, 17:09
Цитата(creer @ 2.4.2008, 0:37)

Вначале несложно, степень можно вычислить через логарифм и экспоненту.
s, да это первые 4 члена данного ряда. Это примерно равно ряду при достаточно малых x. При 0,8 погрешность больше 0,01.
Сама сумма ряда равна y.
Нужно найти такое значение x при котором погрешность между s и y была точно равна 0,01?
ну не совсем точно, прото чтобы она не превышала это значение..
как вычислить у я формулу знаю..
а вот как записать s, и сделать уловие вот в этом проблема
Автор: creer 1.4.2008, 19:47
Я немного переформулирую задачу, поскольку чем ближе к 0, тем меньше разница между s и y. Найти максимальное значение x с точностью epsx, при котором погрешность не превышает eps.
Данное значение находится между 0 и 1.
min:=0;
max:=1;
eps:=0.01;
epsx:=0.0001;
Вычтем s из y. Данная функция возрастает. Для учета погрешности вычтем eps из разности y и s. Фукция (y-s-eps) меняет знак в одной точке на интервале от 0 до 1. Найдем эту точку с погрешностью epsx делением отрезка пополам. Мы делим отрезок, и в зависимости от знака, используем либо левую часть отрезка, либо правую. Когда ширина отрезка станет меньше epsx, необходимое значение будет найдено.
Пишем цикл:
repeat
y:=(1/2)*ln((1+(max+min)/2)/(1-(max+min)/2));
s:=(max+min)/2+exp(3*ln((max+min)/2))/3+exp(5*ln((max+min)/2))/5+exp(7*ln((max+min)/2))/7;
if (y-s-eps)<0 then
min:=(max+min)/2
else
max:=(max+min)/2;
until max-min<epsx;
Значение (max+min)/2 и будет искомым значением.
Автор: otherside 2.4.2008, 3:51
Цитата(creer @ 2.4.2008, 3:47)

Я немного переформулирую задачу, поскольку чем ближе к 0, тем меньше разница между s и y. Найти максимальное значение x с точностью epsx, при котором погрешность не превышает eps.
Данное значение находится между 0 и 1.
min:=0;
max:=1;
eps:=0.01;
epsx:=0.0001;
Вычтем s из y. Данная функция возрастает. Для учета погрешности вычтем eps из разности y и s. Фукция (y-s-eps) меняет знак в одной точке на интервале от 0 до 1. Найдем эту точку с погрешностью epsx делением отрезка пополам. Мы делим отрезок, и в зависимости от знака, используем либо левую часть отрезка, либо правую. Когда ширина отрезка станет меньше epsx, необходимое значение будет найдено.
Пишем цикл:
repeat
y:=(1/2)*ln((1+(max+min)/2)/(1-(max+min)/2));
s:=(max+min)/2+exp(3*ln((max+min)/2))/3+exp(5*ln((max+min)/2))/5+exp(7*ln((max+min)/2))/7;
if (y-s-eps)<0 then
min:=(max+min)/2
else
max:=(max+min)/2;
until max-min<epsx;
Значение (max+min)/2 и будет искомым значением.
А можно как-нибудь без min, max, eps ?
Нам препод говорил что там просто надо вычислить функцию y и функцию s в пределе x(0,2;0,8)
c Шагом 0,2 , а потом уже полученное значение проверить
Автор: otherside 2.4.2008, 5:43
Program laba4;
Var x,y,n,s:real;
Begin
x:=0.2;
While x<=0.8 do
Begin
y:=1/2*ln((1+x)/(1-x));
x:=x+0.2;
Begin
n:=1;
s:=x+(exp(n*ln(x)))/n;
If abs(y-s)<=0.001 then
begin
n:=n+1;
s:=s+(exp(n*ln(x)))/n;
end;
end;
writeln('x=', x);
end;
end.
Может быть вот так? Или что здесь может быть неправильно?
Автор: creer 2.4.2008, 7:09
Добавлю свои комментарии 
Цитата
Program laba4;
Var x,y,n,s:real;
Begin
x:=0.2;
While x<=0.8 do
Begin
y:=1/2*ln((1+x)/(1-x));
x:=x+0.2; //y и s будут считаться при разных x! Нужно либо перенести в начало, либо в конец цикла.
Begin //Begin просто так?
n:=1;
s:=x+(exp(n*ln(x)))/n; //Сумма вычислится неверно, формула же другая? Правильно s:=(exp((2*n-1)*ln(x)))/(2*n-1). При n равном 1 как раз получится x, отдельно его писать не нужно.
If abs(y-s)<=0.001 then //Если разница между первыми двумя (у меня только первым) членами меньше 0.001, тогда посчитать следующий член суммы? Можно написать while abs(y-s)>0.001 do, тогда можно вычислить при каком значении n погрешность становится меньше 0,001
begin
n:=n+1;
s:=s+(exp(n*ln(x)))/n; //Формула аналогично формулы выше s:=s+... .
end;
end; //End от ненужного Begin'а
writeln('x=', x);
end;
end.
Хотя судя по всему, нужно просто написать написать
x:=0.2;
while x<=0.8 do
begin
y:=(1/2)*ln((1+x)/(1-x));
s:=x+exp(3*ln(x))/3+exp(5*ln(x))/5+exp(7*ln(x))/7;
if abs(y-s)<0.01 then writeln('При x=', x, ' погрешность менее 0.01');
x:=x+0.2;
end;
Автор: otherside 2.4.2008, 13:09
Цитата(creer @ 2.4.2008, 15:09)

Добавлю свои комментарии

Хотя судя по всему, нужно просто написать написать
x:=0.2;
while x<=0.8 do
begin
y:=(1/2)*ln((1+x)/(1-x));
s:=x+exp(3*ln(x))/3+exp(5*ln(x))/5+exp(7*ln(x))/7;
if abs(y-s)<0.01 then writeln('При x=', x, ' погрешность менее 0.01');
x:=x+0.2;
end;
Program laba4;
Var x,y,n,s:real;
Begin
x:=0.2;
while x<=0.8 do
begin
y:=(1/2)*ln((1+x)/(1-x));
s:=x+exp(3*ln(x))/3+exp(5*ln(x))/5+exp(7*ln(x))/7;
if abs(y-s)<0.01 then writeln('При x=', x, ' погрешность менее 0.01', 's=',s);
x:=x+0.2;
end;
end.
такая программа?
только нам препод говорил, что в ответе должно получится больше чисел...
Автор: creer 2.4.2008, 18:33
А если так? Цифр стало больше
.
Код
Program laba4;
Var
x,y,n,s:real;
Begin
x:=0.2;
while x<=0.8 do
begin
y:=(1/2)*ln((1+x)/(1-x));
s:=x+exp(3*ln(x))/3+exp(5*ln(x))/5+exp(7*ln(x))/7;
write('При x=', x:1:1, ', s=',s:8:8, ', y=', y:8:8,'. ');
if abs(y-s)<0.01 then
writeln('Погрешность менее 0.01.')
else
writeln('Погрешность более 0.01.');
x:=x+0.2;
end;
end.
Автор: otherside 3.4.2008, 4:41
Цитата(creer @ 3.4.2008, 2:33)

А если так? Цифр стало больше

.
Код
Program laba4;
Var
x,y,n,s:real;
Begin
x:=0.2;
while x<=0.8 do
begin
y:=(1/2)*ln((1+x)/(1-x));
s:=x+exp(3*ln(x))/3+exp(5*ln(x))/5+exp(7*ln(x))/7;
write('При x=', x:1:1, ', s=',s:8:8, ', y=', y:8:8,'. ');
if abs(y-s)<0.01 then
writeln('Погрешность менее 0.01.')
else
writeln('Погрешность более 0.01.');
x:=x+0.2;
end;
end.
мне нужен цикл чтобы он прогонял через формулу суммы каждое число n раз. и потом выдавал их решение. более подходящее к погрешности. то есть при х=0.2 s должно быть равно 0,2 , 0,2066666 и 0,207777. и так со всеми
Автор: creer 3.4.2008, 11:39
А вроде задание было другим
.
Пишем функцию, вычисляющую ряд до заданного члена n в точке x.
Код
function f(x:real; n: integer): real;
var
s: real;
i: integer;
begin
s:=0;
for i:=1 to n do
s:=s+(exp((2*n-1)*ln(x)))/(2*n-1);
f:=s;
end;
Функция вычисляющая при каком n погрешность станет меньше eps.
Если, например, fn(0.2, 0.001) вернет 2, то уже при 2 членах ряда погрешность менее 0.001 в точке 0.2.
Код
function fn(x: real; eps: real): integer;
var
y: real;
n: integer;
s: real;
begin
y:=(1/2)*ln((1+x)/(1-x));
n:=1;
s:=x;
while abs(y-s) > eps do
begin
n:=n+1;
s:=s:=s+(exp((2*n-1)*ln(x)))/(2*n-1);
end;
fn:=n;
end;
Думаю теперь Вы сможете составить программу

.
Автор: otherside 3.4.2008, 12:08
Цитата(creer @ 3.4.2008, 19:39)

Думаю теперь Вы сможете составить программу

.
var
y,x,f: real; s: real; i,n: integer; eps,fn:real;
begin
s:=0;
for i:=1 to n do
s:=s+(exp((2*n-1)*ln(x)))/(2*n-1);
f:=s;
writeln ('f=',f)
begin
y:=(1/2)*ln((1+x)/(1-x));
n:=1;
s:=x;
while abs(y-s) > eps do
begin
n:=n+1;
s:=s+(exp((2*n-1)*ln(x)))/(2*n-1);
writeln ('s=',s)
end;
fn:=n;
writeln ('fn=',fn);
end;
end.
так или я опять что-то не поняла?
Автор: creer 3.4.2008, 13:02
Хм. А чем плохи функции? С ними же удобнее...
Код
var
x: real;
y: real;
n: integer;
function f(x:real; n: integer): real;
var
s: real;
i: integer;
begin
s:=0;
for i:=1 to n do
s:=s+(exp((2*i-1)*ln(x)))/(2*i-1);
f:=s;
end;
function fn(x: real; eps: real): integer;
var
y: real;
n: integer;
s: real;
begin
y:=(1/2)*ln((1+x)/(1-x));
n:=1;
s:=x;
while abs(y-s) > eps do
begin
n:=n+1;
s:=s+(exp((2*n-1)*ln(x)))/(2*n-1);
end;
fn:=n;
end;
begin
x:=0.2;
while x<=0.8 do
begin
y:=(1/2)*ln((1+x)/(1-x)); //Считаем y
writeln('Значение функции в точке x=', x:1:1, ', y=', y:8:8); //Выводим значение y
for n:=1 to 5 do //Для n от 1 до 5 выводим значения суммы ряда
writeln('В точке x=', x:1:1, ', при n=', n, ', сумма ряда равна s=', f(x, n):8:8);
writeln('При n=', fn(x, 0.001), ', погрешность составит менее 0.001');
x:=x+0.2;
end;
end.
Автор: otherside 3.4.2008, 13:07
Цитата(creer @ 3.4.2008, 21:02)

Хм. А чем плохи функции? С ними же удобнее...
Код
var
x: real;
y: real;
n: integer;
function f(x:real; n: integer): real;
var
s: real;
i: integer;
begin
s:=0;
for i:=1 to n do
s:=s+(exp((2*i-1)*ln(x)))/(2*i-1);
f:=s;
end;
function fn(x: real; eps: real): integer;
var
y: real;
n: integer;
s: real;
begin
y:=(1/2)*ln((1+x)/(1-x));
n:=1;
s:=x;
while abs(y-s) > eps do
begin
n:=n+1;
s:=s+(exp((2*n-1)*ln(x)))/(2*n-1);
end;
fn:=n;
end;
begin
x:=0.2;
while x<=0.8 do
begin
y:=(1/2)*ln((1+x)/(1-x)); //Считаем y
writeln('Значение функции в точке x=', x:1:1, ', y=', y:8:8); //Выводим значение y
for n:=1 to 5 do //Для n от 1 до 5 выводим значения суммы ряда
writeln('В точке x=', x:1:1, ', при n=', n, ', сумма ряда равна s=', f(x, n):8:8);
writeln('При n=', fn(x, 0.001), ', погрешность составит менее 0.001');
x:=x+0.2;
end;
end.
спасибо за программу.. а как мне немножко ее изменить, чтобы паскаль выводил на экран значения х, у,s при погрешности <0,01 а не все....
Автор: creer 3.4.2008, 13:26
Вместо
for n:=1 to 5 do //Для n от 1 до 5 выводим значения суммы ряда
Можно написать
for n:=fn(x, 0.01) to 5 do
То есть начинаем выводить значения s, при погрешности менее 0.01 до тех пор, пока n не дойдет до 5.
Автор: otherside 3.4.2008, 14:10
Цитата(creer @ 3.4.2008, 21:26)

Вместо
for n:=1 to 5 do //Для n от 1 до 5 выводим значения суммы ряда
Можно написать
for n:=fn(x, 0.01) to 5 do
То есть начинаем выводить значения s, при погрешности менее 0.01 до тех пор, пока n не дойдет до 5.
а почему только до пяти?
Автор: creer 3.4.2008, 14:24
Мне так захотелось
.
Можно поставить любое число
.
Автор: otherside 3.4.2008, 14:43
Цитата(creer @ 3.4.2008, 22:24)

Мне так захотелось

.
Можно поставить любое число

.
В точке x=0.2, при n=9, сумма ряда равна s=0.20273255
В точке x=0.2, при n=10, сумма ряда равна s=0.20273255
В точке x=0.2, при n=11, сумма ряда равна s=0.20273255
В точке x=0.2, при n=12, сумма ряда равна s=0.20273255
В точке x=0.2, при n=13, сумма ряда равна s=0.20273255
В точке x=0.2, при n=14, сумма ряда равна s=0.20273255
В точке x=0.2, при n=15, сумма ряда равна s=0.20273255
В точке x=0.2, при n=16, сумма ряда равна s=0.20273255
В точке x=0.2, при n=17, сумма ряда равна s=0.20273255
В точке x=0.2, при n=18, сумма ряда равна s=0.20273255
В точке x=0.2, при n=19, сумма ряда равна s=0.20273255
В точке x=0.2, при n=20, сумма ряда равна s=0.20273255
В точке x=0.2, при n=21, сумма ряда равна s=0.20273255
В точке x=0.2, при n=22, сумма ряда равна s=0.20273255
почему все значения равны?
и можно еще вопрос:x:1:1, ', y=', y:8:8 что это значит?
Автор: creer 3.4.2008, 15:32
Цитата
и можно еще вопрос:x:1:1, ', y=', y:8:8 что это значит?
Это число знаков после запятой при выводе и табуляция... Если так писать, то будет выведено число без отступов с 8 знаками после запятой.
Цитата
почему все значения равны?
Просто теперь меняются те цифры, которые не показываются на экране. Ведь чем больше n, тем ближе значение ряда к значению функции. Сравните со значением функции, они равны. Точнее некуда

.
Автор: otherside 3.4.2008, 15:35
Цитата(creer @ 3.4.2008, 23:32)

Это число знаков после запятой при выводе и табуляция... Если так писать, то будет выведено число без отступов с 8 знаками после запятой.
Просто теперь меняются те цифры, которые не показываются на экране. Ведь чем больше n, тем ближе значение ряда к значению функции. Сравните со значением функции, они равны. Точнее некуда

.
спасибочки большое.. единственный форум где мне действительно помогли..
Автор: creer 3.4.2008, 16:03
Удачи в изучении Паскаля
Автор: otherside 3.4.2008, 16:45
Цитата(creer @ 4.4.2008, 0:03)

Удачи в изучении Паскаля

спасибо огромное
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)