Вопрос № 177232: Здравствуйте, Ув. эксперты! Задача: Вычислить значение функции y, развив функцию ln(x) в ряд Тейлора. Аргумент х изменяется от -1 до 3 с шагом 0.5. Определить погрешность. Y= ln(x)+ln(x/2) 0<x<=2 ln(x/2-1) x>=2 Код моей...
Вопрос № 177233: прошу помочь решить такую задачку, как только не пробовал не получается( : заполнить квадрат (произвольную квадратную матрицу) определенным образом начиная с левого нижнего угла, потом справа символ, потом символ над левым нижним и т.д., в общ...
Вопрос № 177232:
Здравствуйте, Ув. эксперты! Задача: Вычислить значение функции y, развив функцию ln(x) в ряд Тейлора. Аргумент х изменяется от -1 до 3 с шагом 0.5. Определить погрешность. Y= ln(x)+ln(x/2) 0<x<=2 ln(x/2-1) x>=2
Код моей программы во вложении. Помогите, пожалуйста, отладить код...убрать ошибки, неточности и т.д. Только начинаю изучать язык...вся надежда на вас... Буду благодарна любой помощи!!!
Отправлен: 14.03.2010, 01:46
Вопрос задал: Gorlova, Х Заблокирован
Всего ответов: 1 Страница вопроса »
Отвечает Verena, Профессионал :
Здравствуйте, Gorlova. Взято из ответов в минифоруме Воробьёва Алексея Викторовича и Barney. Ошибки в коде: 1. log(x) не определена при x<=0, поэтому надо вставить проверку и возвращать NaN - Not A Number. 2. Формула Тейлора реализована неправильно. У Вас log(1+x)=Sum(x^n/n!), а должен быть Sum(x^n/n). Правильный код цикла: member*=x-1; sum+=member/i; 3. В main() ошибка в
условном операторе. В C++ надо писать if(0<=x && x<=2) 4. В main() ошибка при вычислении результата: должно быть не st=log(exp(x)) – log(exp(x/2)); а st=log(x) – log(x/2); Исправленная функция:
Код:
float logon(float x) //Возвращать double н
е имеет смысла, если расчеты происходят с float. Никакого выигрыша в точности это не даст. Или здесь float, или переменные - double { float sum=x-1; int i=2; //с двойки float t=0.001; float member=x-1; while (fabs(member)>t) //сдесь было неправильное условие завершения цикла { member=member*(-(x-1)*(i-1)/i); //текущий элемент за формулой Тейлора sum+=member; i++; } return sum; }
Исправленный цикл:
Код:
for ( x=xn;x<=xk;x+=xs) { flag = 0; //сбрасываем значение переменой на каждой итерации if (0<x && x<=2) //здесь интервал (0; 2] { y=logon(x)-logon(x/2); st=log(x) - log(x/2); err=st-y; } else if (x>2) { y=logon(x/2-1); st=log(x/2-1); err=st-y; } else
flag =1; if ( flag==0) printf (" %f %f %f %f \n", x, y, st, err); else printf (" %f not define \n", x ); }
----- Эта история - не для истории, понимаешь?
Ответ отправил: Verena, Профессионал
Ответ отправлен: 18.03.2010, 22:16
Номер ответа: 260205
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 260205
на номер 1151 (Россия) |
Еще номера »
Вопрос № 177233:
прошу помочь решить такую задачку, как только не пробовал не получается( : заполнить квадрат (произвольную квадратную матрицу) определенным образом начиная с левого нижнего угла, потом справа символ, потом символ над левым нижним и т.д., в общем направление в квадрате справа налево заранее спасибо