![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
otherside |
![]()
Сообщение
#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 |
![]()
Сообщение
#2
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 121 Регистрация: 28.10.2007 Город: Екатеринбург Учебное заведение: УГТУ-УПИ Вы: студент ![]() |
Вначале несложно, степень можно вычислить через логарифм и экспоненту.
s, да это первые 4 члена данного ряда. Это примерно равно ряду при достаточно малых x. При 0,8 погрешность больше 0,01. Сама сумма ряда равна y. Нужно найти такое значение x при котором погрешность между s и y была точно равна 0,01? |
otherside |
![]()
Сообщение
#3
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Вначале несложно, степень можно вычислить через логарифм и экспоненту. s, да это первые 4 члена данного ряда. Это примерно равно ряду при достаточно малых x. При 0,8 погрешность больше 0,01. Сама сумма ряда равна y. Нужно найти такое значение x при котором погрешность между s и y была точно равна 0,01? ну не совсем точно, прото чтобы она не превышала это значение.. как вычислить у я формулу знаю.. а вот как записать s, и сделать уловие вот в этом проблема (IMG:style_emoticons/default/sad.gif) |
creer |
![]()
Сообщение
#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 |
![]()
Сообщение
#5
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Я немного переформулирую задачу, поскольку чем ближе к 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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#8
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Добавлю свои комментарии (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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#10
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
А если так? Цифр стало больше (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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#12
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#14
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Хм. А чем плохи функции? С ними же удобнее... Код 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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#16
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
|
creer |
![]()
Сообщение
#17
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 121 Регистрация: 28.10.2007 Город: Екатеринбург Учебное заведение: УГТУ-УПИ Вы: студент ![]() |
Мне так захотелось (IMG:style_emoticons/default/smile.gif).
Можно поставить любое число (IMG:style_emoticons/default/smile.gif). |
otherside |
![]()
Сообщение
#18
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Мне так захотелось (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 |
![]()
Сообщение
#19
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 121 Регистрация: 28.10.2007 Город: Екатеринбург Учебное заведение: УГТУ-УПИ Вы: студент ![]() |
Цитата и можно еще вопрос:x:1:1, ', y=', y:8:8 что это значит? Это число знаков после запятой при выводе и табуляция... Если так писать, то будет выведено число без отступов с 8 знаками после запятой. Цитата почему все значения равны? Просто теперь меняются те цифры, которые не показываются на экране. Ведь чем больше n, тем ближе значение ряда к значению функции. Сравните со значением функции, они равны. Точнее некуда (IMG:style_emoticons/default/smile.gif). |
otherside |
![]()
Сообщение
#20
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Это число знаков после запятой при выводе и табуляция... Если так писать, то будет выведено число без отступов с 8 знаками после запятой. Просто теперь меняются те цифры, которые не показываются на экране. Ведь чем больше n, тем ближе значение ряда к значению функции. Сравните со значением функции, они равны. Точнее некуда (IMG:style_emoticons/default/smile.gif). спасибочки большое.. единственный форум где мне действительно помогли.. |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 11:11 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru