IPB

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> программа по вичислению рядов в паскале, сравнение двух функций
otherside
сообщение 1.4.2008, 15:05
Сообщение #1


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



подскажите пожалуйста как сделать, нужно в паскале написать программу, которая бы высчитывала значения функций 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
Сообщение #2


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Вначале несложно, степень можно вычислить через логарифм и экспоненту.
s, да это первые 4 члена данного ряда. Это примерно равно ряду при достаточно малых x. При 0,8 погрешность больше 0,01.
Сама сумма ряда равна y.
Нужно найти такое значение x при котором погрешность между s и y была точно равна 0,01?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
otherside
сообщение 1.4.2008, 17:09
Сообщение #3


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(creer @ 2.4.2008, 0:37) *

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

ну не совсем точно, прото чтобы она не превышала это значение..
как вычислить у я формулу знаю..
а вот как записать s, и сделать уловие вот в этом проблема (IMG:style_emoticons/default/sad.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 1.4.2008, 19:47
Сообщение #4


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Я немного переформулирую задачу, поскольку чем ближе к 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
Сообщение #5


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(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
Сообщение #6


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



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
Сообщение #7


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Добавлю свои комментарии (IMG:style_emoticons/default/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
сообщение 2.4.2008, 13:09
Сообщение #8


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(creer @ 2.4.2008, 15:09) *

Добавлю свои комментарии (IMG:style_emoticons/default/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
сообщение 2.4.2008, 18:33
Сообщение #9


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



А если так? Цифр стало больше (IMG:style_emoticons/default/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
сообщение 3.4.2008, 4:41
Сообщение #10


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(creer @ 3.4.2008, 2:33) *

А если так? Цифр стало больше (IMG:style_emoticons/default/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
сообщение 3.4.2008, 11:39
Сообщение #11


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



А вроде задание было другим (IMG:style_emoticons/default/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;


Думаю теперь Вы сможете составить программу (IMG:style_emoticons/default/smile.gif).
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
otherside
сообщение 3.4.2008, 12:08
Сообщение #12


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(creer @ 3.4.2008, 19:39) *

Думаю теперь Вы сможете составить программу (IMG:style_emoticons/default/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
сообщение 3.4.2008, 13:02
Сообщение #13


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Хм. А чем плохи функции? С ними же удобнее...
Код

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
Сообщение #14


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(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
Сообщение #15


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Вместо
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
Сообщение #16


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(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
Сообщение #17


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Мне так захотелось (IMG:style_emoticons/default/smile.gif).
Можно поставить любое число (IMG:style_emoticons/default/smile.gif).
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
otherside
сообщение 3.4.2008, 14:43
Сообщение #18


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(creer @ 3.4.2008, 22:24) *

Мне так захотелось (IMG:style_emoticons/default/smile.gif).
Можно поставить любое число (IMG:style_emoticons/default/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
сообщение 3.4.2008, 15:32
Сообщение #19


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Цитата
и можно еще вопрос:x:1:1, ', y=', y:8:8 что это значит?

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

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

Просто теперь меняются те цифры, которые не показываются на экране. Ведь чем больше n, тем ближе значение ряда к значению функции. Сравните со значением функции, они равны. Точнее некуда (IMG:style_emoticons/default/smile.gif).
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
otherside
сообщение 3.4.2008, 15:35
Сообщение #20


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(creer @ 3.4.2008, 23:32) *

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

спасибочки большое.. единственный форум где мне действительно помогли..
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 



- Текстовая версия Сейчас: 19.4.2024, 23:55

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru