Помощь - Поиск - Пользователи - Календарь
Полная версия: программа по вичислению рядов в паскале > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
otherside
подскажите пожалуйста как сделать, нужно в паскале написать программу, которая бы высчитывала значения функций 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
Вначале несложно, степень можно вычислить через логарифм и экспоненту.
s, да это первые 4 члена данного ряда. Это примерно равно ряду при достаточно малых x. При 0,8 погрешность больше 0,01.
Сама сумма ряда равна y.
Нужно найти такое значение x при котором погрешность между s и y была точно равна 0,01?
otherside
Цитата(creer @ 2.4.2008, 0:37) *

Вначале несложно, степень можно вычислить через логарифм и экспоненту.
s, да это первые 4 члена данного ряда. Это примерно равно ряду при достаточно малых x. При 0,8 погрешность больше 0,01.
Сама сумма ряда равна y.
Нужно найти такое значение x при котором погрешность между s и y была точно равна 0,01?

ну не совсем точно, прото чтобы она не превышала это значение..
как вычислить у я формулу знаю..
а вот как записать s, и сделать уловие вот в этом проблема sad.gif
creer
Я немного переформулирую задачу, поскольку чем ближе к 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
Цитата(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
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
Добавлю свои комментарии smile.gif
Цитата

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
Цитата(creer @ 2.4.2008, 15:09) *

Добавлю свои комментарии smile.gif
Хотя судя по всему, нужно просто написать написать
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
А если так? Цифр стало больше smile.gif.
Код

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
Цитата(creer @ 3.4.2008, 2:33) *

А если так? Цифр стало больше smile.gif.
Код

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
А вроде задание было другим wink.gif.
Пишем функцию, вычисляющую ряд до заданного члена 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;


Думаю теперь Вы сможете составить программу smile.gif.
otherside
Цитата(creer @ 3.4.2008, 19:39) *

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

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
Хм. А чем плохи функции? С ними же удобнее...
Код

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
Цитата(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
Вместо
for n:=1 to 5 do //Для n от 1 до 5 выводим значения суммы ряда
Можно написать
for n:=fn(x, 0.01) to 5 do
То есть начинаем выводить значения s, при погрешности менее 0.01 до тех пор, пока n не дойдет до 5.
otherside
Цитата(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
Мне так захотелось smile.gif.
Можно поставить любое число smile.gif.
otherside
Цитата(creer @ 3.4.2008, 22:24) *

Мне так захотелось smile.gif.
Можно поставить любое число smile.gif.

В точке 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
Цитата
и можно еще вопрос:x:1:1, ', y=', y:8:8 что это значит?

Это число знаков после запятой при выводе и табуляция... Если так писать, то будет выведено число без отступов с 8 знаками после запятой.

Цитата
почему все значения равны?

Просто теперь меняются те цифры, которые не показываются на экране. Ведь чем больше n, тем ближе значение ряда к значению функции. Сравните со значением функции, они равны. Точнее некуда smile.gif.
otherside
Цитата(creer @ 3.4.2008, 23:32) *

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

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

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

спасибо огромное smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.