Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задачка
Форумы Дома Индорил > Клуб > Наука и образование
Страницы: 1, 2
Олири
Девушка попросила помочь, сказала, что решать (как я понял) надо с использованием Паскаля.
Как объяснила: "надо решить сложную задачу на циклические вычислительные процессы..."

Текст задачи: Для заданных значений m и x вычислить бином Ньютона (1+x)m непосредственно и по формуле разложения в ряд 1+x)mСimXim= Для вычисления Сim использования рекуррентное соотношение Сi+1mim(m-i)/(i+1),C0m=1

Было бы неплохо, если бы кто помог) я в этом ничего не соображаю)
iMagus
С разделом может и не ошибся.

ЗЫ. Методичка есть?)

Это задача по программированию? На каком языке?

А, узрел - Паскаль smile.gif

ЗЗЫ. На кого девушка учится? Возможно, ей стоит сменить будущую профессию =\
Олири
Цитата(iMagus @ Dec 28 2010, 3:27) *
С разделом может и не ошибся.

ЗЫ. Методичка есть?)

Это задача по программированию? На каком языке?

А, узрел - Паскаль smile.gif

ЗЗЫ. На кого девушка учится? Возможно, ей стоит сменить будущую профессию =\

так я эта девушка и учусь я в на инженера -строителя..
это операторы цикла с параметром
iMagus
Зачем ты учишься на инженера-строителя?)

Код
function calc_binom(x: integer, m: integer): integer;
begin
calc_binom := pow(1+x,m);
end;

function calc_binom_series(x: integer, m: integer): integer;
var
  sum: real;
  ci, ci1: real;
  i: integer;
begin
i := 1;
ci := 1;
sum := 1;
while i <= m do
  begin
    ci1 := ci*(m-i)/(i+1);
    sum := sum + ci1*pow(x,i);
    ci := ci1;
    i := i + 1;
  end;
calc_binom_series := sum;
end;


Проверить негде сейчас.
Олири

ого..спасибо))))сейчас проверю)) а учусь..ну мне нравиться)))всё....кроме этой задачи))...
Олири
неправильно(( при подстановке x=2 m=3 ответ должен быть 27 а не 5((
Шантина
http://www.cyberforum.ru/

Флаг те в руки, первым делом с решением несложных задач обращаться на этот форум. Как показывает практика без ответа не оставят, в большинстве случаев напишут тебе код с коментариями.

Иногда там тоже от нечего делать помогаю, правда по C#, и заместо высшей математики мне в инсте в голову вложили только опилки))
iMagus
Цитата(Олири @ 28th December 2010 - 17:14) *
неправильно(( при подстановке x=2 m=3 ответ должен быть 27 а не 5((

Значит ты формулу для вычисления биномиальных коэффициентов неправильно написал smile.gif
Или я чего-то пропустил.

Я вот про эту:
Цитата(Олири @ Dec 27 2010, 20:11) *
Для вычисления Сim использования рекуррентное соотношение Сi+1mim(m-i)/(i+1),C0m=1

Олири
балин в условии и впраду рамс ...вот правильное http://www.cyberforum.ru/pascal/thread209046.html
iMagus
Что такое рамс? Регистрироваться на том форуме надо. Чуть позже гляну правильное условие.
Олири
да я не знаю как тут напечатать кое что и поэтому кидаю ссылку..
iMagus
Да нет, все правильно ты написал в 1м посте. Надо подумать, в чем подвох smile.gif

ЗЫ. Фото экрана монитора - это круто yes.gif
Олири
Цитата(iMagus @ Dec 29 2010, 4:01) *
Да нет, все правильно ты написал в 1м посте. Надо подумать, в чем подвох smile.gif

ЗЫ. Фото экрана монитора - это круто yes.gif

неправильно..там сумма от 0 до m...
iMagus
Цитата(Олири @ 28th December 2010 - 21:02) *
неправильно..там сумма от 0 до m...

Это и так было известно.

Я сейчас эту же рекуррентную "формулу" вывел, но она не работает. Тут наверно какая-то методическая ошибка имеет место быть. Настоящий математик объяснил бы наверно ее.
iMagus
В общем, из-за хитрых свойств факториала предложенная формула работать не будет. Либо смысл задания в том и есть, чтобы показать, что формула неправильная. Либо следует уточнить задание.

ЗЫ. К слову сказать, не очень понятно, почему у тебя получилось в ответе - 5
Цитата(Олири @ 28th December 2010 - 17:14) *
неправильно(( при подстановке x=2 m=3 ответ должен быть 27 а не 5((

Должно было получиться 4.3333(3) smile.gif

Скорее всего, потому, что надо было вот эту строку
Код
    ci1 := ci*(m-i)/(i+1);

писать как
Код
    ci1 := ci*(m-i)/(i+1.0);


Паскаль такой Паскаль
Олири
нет там никакой ошибки i и i+1 просто обозначают следующий элемент а не сами степени..
iMagus
Цитата(Олири @ Dec 29 2010, 6:36) *
нет там никакой ошибки i и i+1 просто обозначают следующий элемент а не сами степени..

Ясен пень, что не степени, а след элемент. На то она и рекуррентная формула эта.

Но я нашел багу (зря я формулу ругал).
Так будет правильно
Код
function calc_binom_series(x: integer, m: integer): integer;
var
  sum: real;
  ci, ci1: real;
  i: integer;
begin
i := 1;
ci := 1;
sum := 1;
while i <= m do
  begin
    ci1 := ci*(m-i+1.0)/(i+1.0-1.0);
    sum := sum + ci1*pow(x,i);
    ci := ci1;
    i := i + 1;
  end;
calc_binom_series := sum;
end;


ЗЫ. Более наглядна формула была бы в виде:
Сimi-1m(m-(i-1))/((i-1)+1)
Firehitman
blink.gif Теперь понятно, почему у нас все так криво строят... кирпичи по формулам кладут, да еще и на форумах списанных...
iMagus
Да, и никто, главное, не заметил, где я ошибся поначалу. Пришлось даже неработу алгоритма списать на мистические свойства факториала. А ведь ошибка-то была на поверхности - только я ее не видел, потому, что считал, что в данном месте ошибиться невозможно. Стыдоба! smile.gif

ЗЫ. Фаер, ты о чем?)
Олири
ну он имеет ввиду что я тупая...у вас можт и строят криво)) а я не из владивостока
Олири
а pow это x в степень i ввозводит..а через exp можно? и я не поняла...надо использовать от 0 до m изменение i ... куда это впихнуть? а то мне препод сказала что эт тож важно....я ща пересчитала....не ..нифига неправильно....
iMagus
Цитата(Олири @ 29th December 2010 - 16:10) *
а pow это x в степень i ввозводит..а через exp можно? и я не поняла...надо использовать от 0 до m изменение i ... куда это впихнуть? а то опять неправильно считает..

pow возводит икс в степень и. exp делает нечто иное. В твоем Паскале нет функции pow? Тогда пиши вместо pow:
exp( m * ln(x) ), икс должен быть положительным.

Вот как я написал, должно работать правильно. Разве что я не учел какую-то особенность Паскаля (Паскаля у меня нет - проверить сам не могу).

Вот так это выглядит у меня на Питоне и все работает (проверено)
Раскрывающийся текст
Код
i = 1
ci = ci1 = 1
sum = 1
while i <= m:
  ci1 = ci*(m-i+1)/(i+1-1)
  sum = sum + ci1*(x**i)
  ci = ci1
  i = i + 1
Олири
я с exp так и сделала...считает неправильно...когда вводишь x=0 m=1 ответ должен быть 1 а не 2..
iMagus
Логарифм ноля проблематично посчитать, да. Введи доп. условие в начале - если х=0, то ответ сразу =1.
Олири
я не пр логарифм.... накопление суммы произведения должно быть от 0 до m... сim*xim
Алексиусдворф
как будто "Теорию большого взрыва" читаю... sheldon_sarcasm.gif

popc.gif
Олири
Цитата(Алексиусдворф @ Dec 30 2010, 1:16) *
как будто "Теорию большого взрыва" читаю... sheldon_sarcasm.gif

popc.gif

такие умные все на подкол))можт напишешь задачу лучше чтоб правильно считалось))
iMagus
Цитата(Олири @ 29th December 2010 - 17:30) *
я не пр логарифм.... накопление суммы произведения должно быть от 0 до m... сim*xim

Сумма так и считается. А 2 вместо 1 получается потому, что функция ln(0) возвращает ноль (и это неверно! так как аргументом логарифма может быть только число больше ноля), а exp(0) = 1.

Чтобы этого не происходило, можно переписать функцию так:
Код
function calc_binom_series(x: integer, m: integer): integer;
var
  sum: real;
  ci, ci1: real;
  i: integer;
begin
if x == 0 then
  begin
  calc_binom_series := 1
  exit;
  end;
i := 1;
ci := 1;
sum := 1;
while i <= m do
  begin
    ci1 := ci*(m-i+1.0)/(i+1.0-1.0);
    sum := sum + ci1*exp(m*ln(x));
    ci := ci1;
    i := i + 1;
  end;
calc_binom_series := sum;
end;
Олири
я ввела всё это..всё равно 2 вместо 1(( и exp(0) не от нуля... а при x=0, exp(m)
iMagus
Это невозможно.

Или возможно... тогда надо писать не
if x == 0 then
а
if x = 0 then

Ты паскаль должна знать лучше меня smile.gif


Цитата(Олири @ 29th December 2010 - 19:36) *
и exp(0) не от нуля... а при x=0, exp(m)

m*0 = 0
Олири
Цитата(iMagus @ Dec 30 2010, 2:49) *
Это невозможно.

Или возможно... тогда надо писать не
if x == 0 then
а
if x = 0 then

Ты паскаль должна знать лучше меня smile.gif



m*0 = 0

m*1=m)) там бином то (1+x) в степени m..и ясен перец что я так пписала -if x=0...
iMagus
Цитата(Олири @ 29th December 2010 - 19:51) *
.и ясен перец что я так пписала -if x=0...

Значит, как только на входе х=0, так сразу на выходе должно быть 1. Иное невозможно, если только нет ошибок в синтаксисе.
Олири
Цитата(iMagus @ Dec 30 2010, 2:55) *
Значит, как только на входе х=0, так сразу на выходе должно быть 1. Иное невозможно, если только нет ошибок в синтаксисе.

вот..пипец..

да он всё равно считает неправильно .. при подстановке x=2 m=3 должно быть 27 а он 25 выдаёт..
iMagus
С округлением, видать, проблемы. Поменяй тип для m на real.
Олири
нет не с округлением..в самой задаче косяк..
iMagus
Если у тебя условие "if x = 0 then" не работает, то все возможно. Предложенный же мною алгоритм я для проверки реализовал на Питоне - все работает как часы.
Олири
да если x=0 всё равно ещё от m зависит...
iMagus
Цитата(Олири @ 30th December 2010 - 14:48) *
да если x=0 всё равно ещё от m зависит...

(1 + 0) абсолютно в любой степени будет 1.
Lanser
blink.gif
Олири
странно почему не считает...да и ладно..её наверно сама препод тока знает как делать
iMagus
Цитата(Lanser @ Dec 30 2010, 19:29) *
blink.gif

Имелась в виду абсолютно любая вещественная степень.

Цитата(Олири @ Dec 30 2010, 19:50) *
странно почему не считает...да и ладно..её наверно сама препод тока знает как делать

Скинь сюда свой текст программы.
Олири
program z1;
var
x,m,i:integer;
ci,ci1,sum,pn1:real;
begin
writeln ('vvedite x');
read(x);
writeln ('vvedite m');
read (m);
pn1:=exp(m*ln(1+x));
begin
i:=1;
ci:=1;
sum:=1;
while i<=m do

begin
ci1:=ci*(m-i+1.0)/(i+1.0-1.0);
sum :=sum*ci1*exp(x*ln(i));
ci:=ci1;
i:=i+1;
end;

pn1:=sum;
writeln (pn1:3:3);
writeln (sum:3:3);
end;
end.



iMagus
program z1;
var
x,m,i:integer;
ci,ci1,sum,pn1:real;
begin
writeln ('vvedite x');
read(x);
writeln ('vvedite m');
read (m);
pn1:=exp(m*ln(1+x));
begin
i:=1;
ci:=1;
sum:=1;
while i<=m do

begin
ci1:=ci*(m-i+1.0)/(i+1.0-1.0);
sum :=sum + ci1*exp(i*ln(x));
ci:=ci1;
i:=i+1;
end;

pn1:=sum;
writeln (pn1:3:3);
writeln (sum:3:3);
end;
end.

Я там выше где-то вместо i*ln(x) писал m*ln(x) - тоже бага. Ты вроде ее заметила, но вписала вместо нее свою.

ЗЫ. Жуть
Олири
вот где ты выделил я описалась просто в проге тоже +......
iMagus
Цитата(Олири @ 31st December 2010 - 9:41) *
в проге тоже +

Там не только в плюсе дело. Тоже описалась? Тогда (не помню, как в Паскале приведение типов делается) попробуй написать вместо i * ln(x): real(i)*ln(x) и в строке выше вместо i и m - real(i) и real(m)
Олири
Цитата(iMagus @ Dec 31 2010, 19:16) *
Там не только в плюсе дело. Тоже описалась? Тогда (не помню, как в Паскале приведение типов делается) попробуй написать вместо i * ln(x): real(i)*ln(x) и в строке выше вместо i и m - real(i) и real(m)

в проге тоже +...а real(i) тож не вариант..
iMagus
Цитата(Олири @ 31st December 2010 - 14:44) *
в проге тоже +

я писал не про плюс, а про i и x
Олири
бесполезно..
iMagus
Я только что не поленился, нашел где скачать Паскаль (фри паскаль 2.4.0), скачал его, установил, и выполнил с помощью него программу из поста номер 43 (твоя программа с моей правкой). Ни единого символа в ней не менял. Все работает.
Олири
program z1;
var
x,m,i:integer;
ci,ci1,sum,pn1:real;

begin
writeln ('vvedite x');
read(x);
writeln ('vvedite m');
read (m);

pn1:=exp(m*ln(1+x));

if x=0 then
begin
pn1:=1;
end;


i:=1;
ci:=1;
sum:=1;
while i<=m do

begin
ci1:=ci*(m-i+1.0)/(i+1.0-1.0);
sum :=sum*ci1*exp(i*ln(x));
ci:=ci1;
i:=i+1;
end;

pn1:=sum;
writeln (pn1:3:3);
writeln (sum:3:3);

end.

я ошибку нашла в exp(x*ln(i)) и ещё когда всё исправила он ошибку выдает типа логарифм не может быть равен 0.... когда я ввожу x=0...что с этим делать? и у меня turbo pascal 7.0//
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.