Sova123456 Опубликовано 9 мая, 2008 Жалоба Поделиться Опубликовано 9 мая, 2008 Вычислить сумму членов ряда: y=x^n+x^n-1+......1+x^-1 с точностью до члена ряда меньшего 10^-6 , при изменяющемся от x до xc с шагомdx Подсчитать среднее арифметическое отрицательных y . Текущий член ряда вычислять по формуле: Y0=x^n, Yn=Y(n-1)/x В текстовый файл вывести данные для построения графика . Построить такой график в Excel. Воот в принципе задачка простая,но не могу составить алгоритм именно вычисление суммы ряда? Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 10 мая, 2008 Жалоба Поделиться Опубликовано 10 мая, 2008 (изменено) Не такая уж простая, потому что предписанный алгоритм вычисления ряда, с делением вместо напрашивающегося умножения, неудобный. Заставляют левой рукой чесать правое ухо. Когда x=0, ни формула, ни деление на x, с помощью которого требуют вычислять члены ряда, не будут работать, значит, это надо обрабатывать как особый случай. Кроме того, никто не обещал, что шаг должен быть задан таким, чтобы мы пришли точно на вторую заданную границу, что тоже несколько усложняет проверку - проверяем выход за границу в зависимости от знака шага с учетом возможной погрешности сложения шагов.. Да и вообще формулировка странная "с точностью до члена ряда меньшего 10^-6", я ее интерпретировал так, что как только попадется такой член ряда, мы перестаем вычислять ряд, но на самом-то деле члены такого ряда могут и расти, а могут и вообще идти коромыслом... Ладно, какой вопрос - такой ответ. Так что получается нечто такое: var k,j,n:integer; x,cx,dx,gx,s,y,yt:real; f:text;beginAssign(f,'t.txt'); ReWrite(f); Write('n='); ReadLn(n);Write('x='); ReadLn(x);Write('cx='); ReadLn(cx);Write('dx='); ReadLn(dx);k:=0; s:=0; gx:=cx+1e-6*dx;repeatif x=0 then y:=1 else begin yt:=exp(n*ln(abs(x))); if (x<0)and(n mod 2 <>0) then yt:=-yt; y:=yt; for j:=n downto -1 do begin if abs(yt)<1e-6 then break; yt:=yt/x; y:=y+yt; end; if y<0 then begin s:=s+y; inc(k) end;end;WriteLn(x:10:2,y:10:2);WriteLn(f,x,' ',y);x:=x+dx;until (dx>0)and(x>gx)or(dx<0)and(x<gx);Close(f);if k<>0 then WriteLn('s=',s/k) else WriteLn('no negatives values');WriteLn('s=',s:10:2);ReadLnend. P.S. Если отрицательных членов ряда нет, вместо их среднего выводился ноль, подправил на вывод вместо нуля соответствующего сообщения. Изменено 10 мая, 2008 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти