Полная версия этой страницы:
Задачка
Девушка попросила помочь, сказала, что решать (как я понял) надо с использованием Паскаля.
Как объяснила: "надо решить сложную задачу на циклические вычислительные процессы..."
Текст задачи: Для заданных значений m и x вычислить бином Ньютона (1+x)m непосредственно и по формуле разложения в ряд 1+x)mСimXim= Для вычисления Сim использования рекуррентное соотношение Сi+1m=Сim(m-i)/(i+1),C0m=1
Было бы неплохо, если бы кто помог) я в этом ничего не соображаю)
iMagus
Dec 27 2010, 20:27
С разделом может и не ошибся.
ЗЫ. Методичка есть?)
Это задача по программированию? На каком языке?
А, узрел - Паскаль
ЗЗЫ. На кого девушка учится? Возможно, ей стоит сменить будущую профессию =\
Цитата(iMagus @ Dec 28 2010, 3:27)
С разделом может и не ошибся.
ЗЫ. Методичка есть?)
Это задача по программированию? На каком языке?
А, узрел - Паскаль
ЗЗЫ. На кого девушка учится? Возможно, ей стоит сменить будущую профессию =\
так я эта девушка и учусь я в на инженера -строителя..
это операторы цикла с параметром
iMagus
Dec 27 2010, 21:06
Зачем ты учишься на инженера-строителя?)
Код
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((
Шантина
Dec 28 2010, 17:18
http://www.cyberforum.ru/Флаг те в руки, первым делом с решением несложных задач обращаться на этот форум. Как показывает практика без ответа не оставят, в большинстве случаев напишут тебе код с коментариями.
Иногда там тоже от нечего делать помогаю, правда по C#, и заместо высшей математики мне в инсте в голову вложили только опилки))
iMagus
Dec 28 2010, 17:49
Цитата(Олири @ 28th December 2010 - 17:14)
неправильно(( при подстановке x=2 m=3 ответ должен быть 27 а не 5((
Значит ты формулу для вычисления биномиальных коэффициентов неправильно написал
Или я чего-то пропустил.
Я вот про эту:
Цитата(Олири @ Dec 27 2010, 20:11)
Для вычисления Сim использования рекуррентное соотношение Сi+1m=Сim(m-i)/(i+1),C0m=1
iMagus
Dec 28 2010, 20:53
Что такое рамс? Регистрироваться на том форуме надо. Чуть позже гляну правильное условие.
да я не знаю как тут напечатать кое что и поэтому кидаю ссылку..
iMagus
Dec 28 2010, 21:01
Да нет, все правильно ты написал в 1м посте. Надо подумать, в чем подвох
ЗЫ. Фото экрана монитора - это круто
Цитата(iMagus @ Dec 29 2010, 4:01)
Да нет, все правильно ты написал в 1м посте. Надо подумать, в чем подвох
ЗЫ. Фото экрана монитора - это круто
неправильно..там сумма от 0 до m...
iMagus
Dec 28 2010, 22:07
Цитата(Олири @ 28th December 2010 - 21:02)
неправильно..там сумма от 0 до m...
Это и так было известно.
Я сейчас эту же рекуррентную "формулу" вывел, но она не работает. Тут наверно какая-то методическая ошибка имеет место быть. Настоящий математик объяснил бы наверно ее.
iMagus
Dec 28 2010, 23:47
В общем, из-за хитрых свойств факториала предложенная формула работать не будет. Либо смысл задания в том и есть, чтобы показать, что формула неправильная. Либо следует уточнить задание.
ЗЫ. К слову сказать, не очень понятно, почему у тебя получилось в ответе - 5
Цитата(Олири @ 28th December 2010 - 17:14)
неправильно(( при подстановке x=2 m=3 ответ должен быть 27 а не 5((
Должно было получиться 4.3333(3)
Скорее всего, потому, что надо было вот эту строку
Код
ci1 := ci*(m-i)/(i+1);
писать как
Код
ci1 := ci*(m-i)/(i+1.0);
Паскаль такой Паскаль
нет там никакой ошибки i и i+1 просто обозначают следующий элемент а не сами степени..
iMagus
Dec 29 2010, 11:44
Цитата(Олири @ 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;
ЗЫ. Более наглядна формула была бы в виде:
С
im=С
i-1m(m-(i-1))/((i-1)+1)
Firehitman
Dec 29 2010, 12:51
Теперь понятно, почему у нас все так криво строят... кирпичи по формулам кладут, да еще и на форумах списанных...
iMagus
Dec 29 2010, 13:15
Да, и никто, главное, не заметил, где я ошибся поначалу. Пришлось даже неработу алгоритма списать на мистические свойства факториала. А ведь ошибка-то была на поверхности - только я ее не видел, потому, что считал, что в данном месте ошибиться невозможно. Стыдоба!
ЗЫ. Фаер, ты о чем?)
ну он имеет ввиду что я тупая...у вас можт и строят криво)) а я не из владивостока
а pow это x в степень i ввозводит..а через exp можно? и я не поняла...надо использовать от 0 до m изменение i ... куда это впихнуть? а то мне препод сказала что эт тож важно....я ща пересчитала....не ..нифига неправильно....
iMagus
Dec 29 2010, 16:32
Цитата(Олири @ 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
Dec 29 2010, 16:47
Логарифм ноля проблематично посчитать, да. Введи доп. условие в начале - если х=0, то ответ сразу =1.
я не пр логарифм.... накопление суммы произведения должно быть от 0 до m... сim*xim
Алексиусдворф
Dec 29 2010, 18:16
как будто "Теорию большого взрыва" читаю...
Цитата(Алексиусдворф @ Dec 30 2010, 1:16)
как будто "Теорию большого взрыва" читаю...
такие умные все на подкол))можт напишешь задачу лучше чтоб правильно считалось))
iMagus
Dec 29 2010, 19:25
Цитата(Олири @ 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
Dec 29 2010, 19:49
Это невозможно.
Или возможно... тогда надо писать не
if x == 0 then
а
if x = 0 then
Ты паскаль должна знать лучше меня
Цитата(Олири @ 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
Ты паскаль должна знать лучше меня
m*0 = 0
m*1=m)) там бином то (1+x) в степени m..и ясен перец что я так пписала -if x=0...
iMagus
Dec 29 2010, 19:55
Цитата(Олири @ 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
Dec 29 2010, 20:11
С округлением, видать, проблемы. Поменяй тип для m на real.
нет не с округлением..в самой задаче косяк..
iMagus
Dec 30 2010, 13:03
Если у тебя условие "if x = 0 then" не работает, то все возможно. Предложенный же мною алгоритм я для проверки реализовал на Питоне - все работает как часы.
да если x=0 всё равно ещё от m зависит...
iMagus
Dec 30 2010, 15:00
Цитата(Олири @ 30th December 2010 - 14:48)
да если x=0 всё равно ещё от m зависит...
(1 + 0) абсолютно в любой степени будет 1.
Lanser
Dec 30 2010, 19:29
странно почему не считает...да и ладно..её наверно сама препод тока знает как делать
iMagus
Dec 30 2010, 19:59
Цитата(Lanser @ Dec 30 2010, 19:29)
Имелась в виду абсолютно любая вещественная степень.
Цитата(Олири @ 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
Dec 30 2010, 21:01
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
Dec 31 2010, 12:16
Цитата(Олири @ 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
Dec 31 2010, 16:33
Цитата(Олири @ 31st December 2010 - 14:44)
в проге тоже +
я писал не про плюс, а про i и x
Я только что не поленился, нашел где скачать Паскаль (фри паскаль 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//
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.