Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 29.09.2010, 01:22   #1 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию Тоже проблема с Рядом Тейлора.

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью рада Тейлора, на интервале от хнач до хкон с шагом dx с точностью Эпсилон. Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента, значение функции и колличество просуммированных членов ряда.
Просмотрев предыдущую программу. многое не поняла. Если у кого-то есть возможность написать не просто прогу, а добавить комментарии. Заранее спасибо.
Миниатюры
caaeaiea-3.2.png  
Хелен вне форума   Ответить с цитированием

Старый 29.09.2010, 01:22
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Посмотрите данные темки и узнайте больше

Тоже ведь проблема...
Помогите с задачей. Ряд Тейлора.

Старый 29.09.2010, 10:47   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,952
Сказал(а) спасибо: 322
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Хелен Посмотреть сообщение
Просмотрев предыдущую программу. многое не поняла.
Лена, а вот давайте начнем именно с этого. Чего Вы не поняли? Задавайте вопросы, попробуем разобраться.
В Вашем случае программа выглядит вот так:
Код:
CONST
 Eps=0.0001;
VAR
 Xbeg,Xfin,DX,SUM,X:REAL;
 N:WORD;
 Nx,i:INTEGER;

FUNCTION ArcCos(Xa:Extended):Extended;
 begin
  if ROUND(Xa*10000000)=10000000 then ArcCos:=0 else
  if ROUND(Xa*10000000)=-10000000 then ArcCos:=Pi else
  ArcCos:=(Pi/2)-ArcTan(Xa/SQRT(1-Xa*Xa));
 end;


PROCEDURE SUMS(Xs:REAL; Var S:REAL; Var Ns:WORD);
 VAR
   a:REAL;
 Begin
  a:=Xs;
  S:=Xs;
  Ns:=0;
  Repeat
   Inc(Ns);
   a:=a*SQR(Xs)*(2*Ns-1)*(2*Ns-1)/(2*Ns)/(2*Ns+1);
   S:=S+a;
  Until Abs(a)<Eps;
  S:=Pi/2-S;
 End;

BEGIN
 Write('Xbeg= ');
 ReadLn(Xbeg);
 Write('Xfin= ');
 ReadLn(Xfin);
 Write('DX= ');
 ReadLn(DX);
 WriteLn;
 WriteLn('         Results of calculation:');
 WriteLn('    X          SUM         N    ArcCos(X)');
 WriteLn;
 Nx:=ROUND((Xfin-Xbeg)/DX);
 X:=Xbeg;
 For i:=0 to Nx do
  begin
   X:=Xbeg+DX*i;
   SUMS(X,SUM,N);
   WriteLn(X:8:5,'     ',SUM:7:5,'     ',N:3,'     ',ArcCos(X):7:5);
  end;
 ReadLn;
END.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 30.09.2010, 08:35   #3 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

Спасибо. Сравню с тем, что написала и отвечу =)
Хелен вне форума   Ответить с цитированием
Старый 30.09.2010, 21:09   #4 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

Вот мой код. Мне кажется, что несмотря на длину, он более удачен.

PHP код:
program var20; {$N+}
const 
pi2 3.141592653589793238462643/2;
var
   
x,x1,xk,dx,e,i:integer;
   
itog:extended;
   
sstring;
   
shirinteger;

{
procedura razmnozhaet simvol na ekrane}
procedure mnogo(si:char;k:integer);
var 
tmpiinteger;
begin
for tmpi := 1 to k do write(si);
end;

{
funkcia vozvodit chislo v stepen}
function 
step(ch,stinteger): extended;
var 
tmpiinteger;
    
tmpsextended;
begin
     tmps 
:= 1;
for 
tmpi := 1 to st do tmps := tmps ch;
     
step := tmps;
end;

{
schitaem znachenie odnoy drobi s nomerom NOM}
function 
drob(nominteger): extended;
var
   
ntmpiinteger;
reextended; {re resultat}
begin
  n 
:= 2*nom+1;
  
re := 1;
  for 
tmpi := 1 to n-do
if (
tmpi mod 2) =1 then re := re tmpi else re := re tmpi;
  
re := re n;
  
drob := re;
end;

{
schitaem summu drobey}
function 
sumdrobextended;
var
   
iinteger;
   
sumextended;
begin
  sum 
:= x;
  for 
:= 1 to x do
sum := sum drob(i)*step(x,2*+1);
  
sumdrob := sum;
end;

{ ************* 
main program *********** }
begin
{x1:=1;xk:=6;dx:=1;e:=5;} {eto dlya proverki}
     
writeln;writeln;writeln;
write('Input x1: ');readln(x1);
write('Input xk: ');readln(xk);
write('Input dx: ');readln(dx);
write('Input e: ');readln(e);
     
writeln;writeln;writeln;

     {
Kakaya u nas shirina}
       
shir := 1;
     for 
:= x1 to xk do
     
begin
str
((pi2-sumdrob):2:e,s); {vychislim i preobrazuem v string}
if (
length(s) +2) > shir then shir := length(s) +2;
     
end;
if 
shir 10 then shir := 10; {minimum 10}

{
Risuem zagolovok tablicy}
writeln(' Moya super-puper formula');
mnogo('=',shir+16);writeln;
     {
zagolovki}
write('| X | ');
mnogo(' ',(shir-8div 2); {probely DO}
write('Zna4enie');
mnogo(' ',shir-8-((shir-8div 2)); {probely POSLE}
writeln(' | Kol |');
mnogo('=',shir+16);writeln;

     {
Nachinaem}
     
:= x1; {ot nachala}
     while 
<= xk do
     
begin
       itog 
:= pi2-sumdrob;

writeln('| 'x:3' | ', (itog):shir:e' | ', (x+1):3' |');
:= dx; {i kazdiy raz pribavlaem}
     
end;

mnogo('=',shir+16);writeln;
     
readln;
end
Хелен вне форума   Ответить с цитированием
Старый 30.09.2010, 21:34   #5 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,952
Сказал(а) спасибо: 322
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Нет, Лена - так дело не пойдет!
Весь диапазон допустимых значений аргумента функции (х) - от -1 до +1 , а Вы задаёте ему тип Integer! Это прежде всего.
Из мелочей - нет нужды вводить численное значение константы "пи" - в Паскале есть стандартная функция Pi, отдающая это значение с высокой точностью.
В других аспектах программы не разбирался.
А что касается "удачен"-"неудачен" - так это дело вкуса. Мне мой больше нравится. Хотя там украшательства минимизированы (псевдографика и пр.). Но, повторяю, у каждого программиста свой стиль.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 01.10.2010, 00:10   #6 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

Есть нужда вводить Пи в константу, дабы далее укоротить программу, если заметите, что в константе добавлены /2.
И, к сожалению, для преподавателя важна графика, т.к. учимся мы подготавливать разнообразные программы для лёгкого обращения любым пользователем...
Хелен вне форума   Ответить с цитированием
Старый 01.10.2010, 10:28   #7 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,952
Сказал(а) спасибо: 322
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Хелен Посмотреть сообщение
Есть нужда вводить Пи в константу, дабы далее укоротить программу, если заметите, что в константе добавлены /2.
И, к сожалению, для преподавателя важна графика, т.к. учимся мы подготавливать разнообразные программы для лёгкого обращения любым пользователем...
Лена, Вы совсем не о том - повторяю, все эти константы да псевдографика - чушь на постном масле (хотя, если честно, абсолютно не вижу, что изменится, если строку
itog := pi2-sumdrob;
заменить строкой
itog := pi/2-sumdrob;
и
при этом никакую константу не вводить. Но это так, к слову - хотите со своей константой - Ваше дело). Куда важнее другое.

1. Еще раз обращаю внимание - Вы считаете значения функции arccos(x). Эта функция определена в интервале значений х
-1 ≤ х ≤ +1
а потому использование целочисленных (integer) форматов переменных x, x1, xk, dx АБСОЛЮТНО НЕДОПУСТИМО.
2. Вы совершенно неправильно трактуете смысл величины эпсилон (ε). Эта величина никакого отношения к форматам вывода чисел не имеет, а определяет, в конечном итоге, количество членов ряда, которое необходимо взять, чтобы результат был вычислен с заданной точностью (поэтому в моей программе и предусмотрен, для сравнения, вывод в последней колонке ТОЧНОГО значения функции arccos). По сути ε - это ни что иное, как значение остаточного члена ряда Тейлора. Почитайте в учебнике по матанализу, что есть остаточный член в форме Коши или в форме Пеано. В первом приближении (как сделано в моей программе) ряд можно прервать, когда следующий член разложения становится по абсолютной величине меньшим, чем наперед заданное ε, например ε=0.0001.

И вообще, посмотрев внимательнее Вашу программу, пришел я к выводу, что Вы не очень четко разобрались в том, что такое ряд Тейлора, в частности Вы явно путаете переменную x с индексом суммирования n.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 01.10.2010, 23:44   #8 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

Я не путаю. программа проверена. множество значений подставлено и просчитано. программа выдаёт верные ответы, что и требовалось.
И... согласна - у каждого свой стиль.
Хелен вне форума   Ответить с цитированием
Старый 08.11.2010, 16:25   #9 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

ещё можно задавать вопросы по вашей программе??

Откуда вы взяли эту формулу??

Nx:=ROUND((Xfin-Xbeg)/DX);
Хелен вне форума   Ответить с цитированием
Старый 09.11.2010, 21:33   #10 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,952
Сказал(а) спасибо: 322
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Хелен Посмотреть сообщение
ещё можно задавать вопросы по вашей программе??

Откуда вы взяли эту формулу??

Nx:=ROUND((Xfin-Xbeg)/DX);
Дык... из головы, вестимо. А что в ней странного или непонятного? Если интервал от a до b разбит на N равных промежутков, то величина каждого промежутка D есть (b-a)/N; в свою очередь, если мы знаем D и хотим определить N, то имеем N=(b-a)/D. Округление (Round) там применено потому, что N должно быть целым.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 02:50.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.