Koshak Опубликовано 22 мая, 2012 Жалоба Поделиться Опубликовано 22 мая, 2012 ребят, ни у кого не завалялось нахождение корней линейного уравнения методом хорд на С++?буду очень благодарен... Ссылка на комментарий
martinges Опубликовано 23 мая, 2012 Жалоба Поделиться Опубликовано 23 мая, 2012 гммм ))дык там вроде как просто берешь нужную погрешность e= допустим 0.0001находишь участок возрастания или убывания функции, тогда явно будет одно пересечение с осью абцисс=один корень края отрезка пусть будет x1 и x2 причем соответственно f(x1)>(<)0 а f(x2)<(>)0вычислим значения уравнения в этих точках) так как координаты точек известны, подставим в уравнения прямой, проходящей через две точки потом обнулим y найдем x----> это будет первая хорда пересекающая ось абцисс) далее смотрим значение f(x) в данной точке и подставляем его либо в левую либо в правую границу(в зависимости от знака f(x) делаешь так до тех пор пока значение функции в новой точке не станет меньше твоей предполагаемой погрешности P.S. Блин много слов, на графике показать проще P.P.S. Сам алгоритм совсем мало строк занимает Ссылка на комментарий
Koshak Опубликовано 23 мая, 2012 Автор Жалоба Поделиться Опубликовано 23 мая, 2012 спасибо, а нельзя на примере?long double F(long double x){ long double f; long double e=2.72; f=2*(pow(e,-x))-(pow(x-2,2)); return f;}long double Fp1(long double x){ long double f; long double e=2.72; f=-2*x-2*(pow(e,-x))+4; return f;}long double Fp2(long double x){ long double f; long double e=2.72; f=2*(pow(e,-x))-2; return f;}}это моё уравнение.и первая и вторая его производные.саму функцию вот незнаю как описать.long double m_hord(long double left,long double right){long double epsilon=0,001//погрешность}графики еще такой вопрос.я незнаю как в С++ написать e(эпсилон)в коде видно, что я просто беру переменную e и даю ей значение 2,72.так можно? Ссылка на комментарий
AgaOnline Опубликовано 23 мая, 2012 Жалоба Поделиться Опубликовано 23 мая, 2012 Очень просто: добавляете второй аргумент в параметры через запятую.{ return 2*(pow(e,-x))-(pow(x-2,2));}long double Fp1(long double x, long double e){return -2*x-2*(pow(e,-x))+4;}long double Fp2(long double x, long double e){ return 2*(pow(e,-x))-2;}}//код чуток оптимизировал, убрал лишние строки.long double F(long double x, long double e)А в самой функции уже вызывать вот так:long double m_hord(long double left,long double right){long double epsilon=0,001//погрешностьlong double h = epsilon/10; //шагfor(long double x=left; x{ long double y = F(x, epsilon); //вызов самой функции //...}//...}Откуда цифра 2,72? Это же погрешность вычисления. Она должна быть всяко меньше 1 Ссылка на комментарий
Koshak Опубликовано 23 мая, 2012 Автор Жалоба Поделиться Опубликовано 23 мая, 2012 Откуда цифра 2,72? Это же погрешность вычисления. Она должна быть всяко меньше 1погрешность вычислений-это переменная epsilon, а цифра 2,72-это эпсилон.у меня уравнение 2*e^-x - (x-2)^2=0.вот e-это и есть эпсилон, который примерно равен 2,72Добавлено спустя 1 минуту 10 секунд:меня больше интересует сам алгоритм метода хорд на С++, а не вызов функции Ссылка на комментарий
AgaOnline Опубликовано 23 мая, 2012 Жалоба Поделиться Опубликовано 23 мая, 2012 погрешность вычислений-это переменная epsilon, а цифра 2,72-это эпсилон.у меня уравнение 2*e^-x - (x-2)^2=0.вот e-это и есть эпсилон, который примерно равен 2,72Добавлено спустя 1 минуту 10 секунд:Добавьте#include и пользуйтесь функцией exp(x)меня больше интересует сам алгоритм метода хорд на С++, а не вызов функцииСам алгоритм то вы сможете сформулировать? На любом языке? Ссылка на комментарий
Koshak Опубликовано 23 мая, 2012 Автор Жалоба Поделиться Опубликовано 23 мая, 2012 погрешность вычислений-это переменная epsilon, а цифра 2,72-это эпсилон.у меня уравнение 2*e^-x - (x-2)^2=0.вот e-это и есть эпсилон, который примерно равен 2,72Добавлено спустя 1 минуту 10 секунд:Добавьте#include и пользуйтесь функцией exp(x)а это разве не экспонента?меня больше интересует сам алгоритм метода хорд на С++, а не вызов функцииСам алгоритм то вы сможете сформулировать? На любом языке?в том и дело, что нет Ссылка на комментарий
AgaOnline Опубликовано 23 мая, 2012 Жалоба Поделиться Опубликовано 23 мая, 2012 а это разве не экспонента?В примере у вас как раз и была экспонентав том и дело, что нетЯ не буду посылать вас в Гугл набирать сложные запросы, поэтому нажмите сюда, первая ссылка сверху(второй пост). Ссылка на комментарий
Koshak Опубликовано 23 мая, 2012 Автор Жалоба Поделиться Опубликовано 23 мая, 2012 спасибо, поможете разобраться с непонятными местами в коде? Ссылка на комментарий
AgaOnline Опубликовано 23 мая, 2012 Жалоба Поделиться Опубликовано 23 мая, 2012 ок, пишите что непонятно Ссылка на комментарий
martinges Опубликовано 23 мая, 2012 Жалоба Поделиться Опубликовано 23 мая, 2012 по графику видно что три отрезка) [-3;-2] [1;2] [2;3]натрави алгоритм на них)) приближай хорду к корню)текс) эпсилон это погрешность она обычно весьма маленькая)e- это экспонента в первой степени 2,72 это примерное её значение я бы начал как то так)1 сделал функцию вычисляющую значение твоей функции)2 цикл с пост условием (условие выхода значение функции в точке пересечения хорды с осью абцисс< epsilon)3 внутри цикла: получить точку пересечения с осью абцисс хорды проходящей через 2 точки(тупо подставить x границы получим y) имея 2 координаты получим уравнение вида y=k*x+b4 получили новый X проверяем f(X) смотрим знак) и меняем границу в зависимости от знакопеременности)P.S. получится куча замен границ каждый раз)) будешь сужать отрезок)) пока чудом не попадешь в нужное приближение корня Ссылка на комментарий
Koshak Опубликовано 23 мая, 2012 Автор Жалоба Поделиться Опубликовано 23 мая, 2012 int main() { setlocale(LC_ALL,"Russian"); cout << "уравнение 2*e^-x - (x-2)^2=0 " << endl; int it=0; long double a=1, b=6; cout << "Начальное приближение: A=" << a << ", B=" << b << endl; cout << "=============" << endl; long double Xi1=0, Xi=b, Xim1=a; while(1)//что такое while(1)? { long double xpr=Xi1; Xi1=(-F(Xim1)*(Xi-Xim1)) / (F(Xi)-F(Xim1))+Xim1;//вообще не понятно что это if (F(Xim1)*F(xpr)>0) {//вообще не понятно что это Xi=Xi1; //b Xim1=Xim1; //a } else { Xi=Xi; //b Xim1=Xi1; //a } it++; cout << "Значение X на итерации " << it << ": "<< Xi << endl; if (fabs(Xi1-xpr)<0.001) break;//что такое fabs? } cout << "============="; cout << endl <<"Всего итераций: " << it << endl; cout << "корень уравнения: " << Xi << ", с точностью 0.001" << endl; system("pause"); return 0; }и тут нельзя задать отрицательный промежуток.корни только положительные.как это исправить?Добавлено спустя 15 минут 33 секунды:вообще, в целом задание-найти корень уравнения методом дихотомии и методом хорд.вот мой код#include #include #include #include #include using namespace std; long double F(long double x) { return 2*exp(pow(x,-1))-pow((x-2),2); } long double Dihotomiya (long double a,long double { long double c; c=(a+b)/2; while(b-a>0.001) { if( F(a)*F(c)<0) b=c; else a=c; c=(b+a)/2; } return c; } int main() { setlocale(LC_ALL,"Russian"); cout << "уравнение 2*e^-x - (x-2)^2=0 " << endl; int it=0; long double a=1, b=2; cout << "Начальное приближение: A=" << a << ", B=" << b << endl; cout << "=============" << endl; long double Xi1=0, Xi=b, Xim1=a; while(1) { long double xpr=Xi1; Xi1=(-F(Xim1)*(Xi-Xim1)) / (F(Xi)-F(Xim1))+Xim1; if (F(Xim1)*F(xpr)>0) { Xi=Xi1; //b Xim1=Xim1; //a } else { Xi=Xi; //b Xim1=Xi1; //a } it++; cout << "Значение X на итерации " << it << ": "<< Xi << endl; if (fabs(Xi1-xpr)<0.001) break; } cout << "============="; cout << endl <<"Всего итераций: " << it << endl; cout << "корень уравнения: " << Xi << ", с точностью 0.001" << endl; cout << "=================="; cout << endl;cout << "метод дихотомии" << endl; cout << "корень с точностью 0.001 равен " << Dihotomiya(a,; system("pause >> void"); return 0; }и он работает неправильно...кароче, корни выводятся неверные.помогите кто чем можетпоследнее задание для зачета к пятнице Ссылка на комментарий
Одуванчик Опубликовано 24 мая, 2012 Жалоба Поделиться Опубликовано 24 мая, 2012 Вот это ты код накрутил О.ОНельзя что ли проще?) Ссылка на комментарий
Koshak Опубликовано 24 мая, 2012 Автор Жалоба Поделиться Опубликовано 24 мая, 2012 метод хорд int it=0; long double a=1, b=2; cout << "Начальное приближение: A=" << a << ", B=" << b << endl; cout << "=============" << endl; long double Xi1=0, Xi=b, Xim1=a; while(1) { long double xpr=Xi1; Xi1=(-F(Xim1)*(Xi-Xim1)) / (F(Xi)-F(Xim1))+Xim1; if (F(Xim1)*F(xpr)>0) { Xi=Xi1; //b Xim1=Xim1; //a } else { Xi=Xi; //b Xim1=Xi1; //a } it++;метод дихотомии long double Dihotomiya (long double a,long double { long double c; c=(a+b)/2; while(b-a>0.001) { if( F(a)*F(c)<0) b=c; else a=c; c=(b+a)/2; } return c; }уравнение long double F(long double x) { return 2*exp(pow(x,-1))-pow((x-2),2); Ссылка на комментарий
promises Опубликовано 30 мая, 2012 Жалоба Поделиться Опубликовано 30 мая, 2012 while(1) { long double xpr=Xi1; Xi1=(-F(Xim1)*(Xi-Xim1)) / (F(Xi)-F(Xim1))+Xim1; if (F(Xim1)*F(xpr)>0) { Xi=Xi1; //b Xim1=Xim1; //a } else { Xi=Xi; //b Xim1=Xi1; //a } it++; cout << "Значение X на итерации " << it << ": "<< Xi << endl; if (fabs(Xi1-xpr)<0.001) break; }Зачем тебе вообще переменная xpr понадобилась? Убери её и в условии замени xpr на Xi1 Ссылка на комментарий
Рекомендуемые сообщения
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти