Перейти к содержанию

метод хорд решения линейных уравнений.С++


Рекомендуемые сообщения

гммм ))

дык там вроде как просто :)

берешь нужную погрешность e= допустим 0.0001

находишь участок возрастания или убывания функции, тогда явно будет одно пересечение с осью абцисс=один корень :)

края отрезка пусть будет x1 и x2 причем соответственно f(x1)>(<)0 а f(x2)<(>)0

вычислим значения уравнения в этих точках) так как координаты точек известны, подставим в уравнения прямой, проходящей через две точки :) потом обнулим y найдем x----> это будет первая хорда пересекающая ось абцисс) далее смотрим значение f(x) в данной точке и подставляем его либо в левую либо в правую границу(в зависимости от знака f(x) :)

делаешь так до тех пор пока значение функции в новой точке не станет меньше твоей предполагаемой погрешности :)

P.S. Блин много слов, на графике показать проще :)

P.P.S. Сам алгоритм совсем мало строк занимает :)

Ссылка на комментарий

спасибо, а нельзя на примере?:)

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//погрешность

}

график

WolframAlpha--2e-x_-_x-220--2012-05-23_0237.gif

и еще такой вопрос.я незнаю как в С++ написать e(эпсилон)

в коде видно, что я просто беру переменную e и даю ей значение 2,72.так можно?

Ссылка на комментарий

Очень просто: добавляете второй аргумент в параметры через запятую.


{
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

Ссылка на комментарий

Откуда цифра 2,72? Это же погрешность вычисления. Она должна быть всяко меньше 1

погрешность вычислений-это переменная epsilon, а цифра 2,72-это эпсилон.у меня уравнение 2*e^-x - (x-2)^2=0.вот e-это и есть эпсилон, который примерно равен 2,72

Добавлено спустя 1 минуту 10 секунд:

меня больше интересует сам алгоритм метода хорд на С++, а не вызов функции:(

Ссылка на комментарий

погрешность вычислений-это переменная epsilon, а цифра 2,72-это эпсилон.у меня уравнение 2*e^-x - (x-2)^2=0.вот e-это и есть эпсилон, который примерно равен 2,72

Добавлено спустя 1 минуту 10 секунд:

Добавьте

#include

и пользуйтесь функцией exp(x)

меня больше интересует сам алгоритм метода хорд на С++, а не вызов функции:(

Сам алгоритм то вы сможете сформулировать? На любом языке?

Ссылка на комментарий

погрешность вычислений-это переменная epsilon, а цифра 2,72-это эпсилон.у меня уравнение 2*e^-x - (x-2)^2=0.вот e-это и есть эпсилон, который примерно равен 2,72

Добавлено спустя 1 минуту 10 секунд:

Добавьте

#include

и пользуйтесь функцией exp(x)

а это разве не экспонента?

меня больше интересует сам алгоритм метода хорд на С++, а не вызов функции:(

Сам алгоритм то вы сможете сформулировать? На любом языке?

в том и дело, что нет:(

Ссылка на комментарий

а это разве не экспонента?

В примере у вас как раз и была экспонента

в том и дело, что нет:(

Я не буду посылать вас в Гугл набирать сложные запросы, поэтому нажмите сюда, первая ссылка сверху(второй пост).

Ссылка на комментарий

по графику видно что три отрезка) [-3;-2] [1;2] [2;3]

натрави алгоритм на них)) приближай хорду к корню)

текс) эпсилон это погрешность она обычно весьма маленькая)

e- это экспонента в первой степени 2,72 это примерное её значение :)

я бы начал как то так)

1 сделал функцию вычисляющую значение твоей функции)

2 цикл с пост условием (условие выхода значение функции в точке пересечения хорды с осью абцисс< epsilon)

3 внутри цикла: получить точку пересечения с осью абцисс хорды проходящей через 2 точки(тупо подставить x границы получим y) имея 2 координаты получим уравнение вида y=k*x+b

4 получили новый X проверяем f(X) смотрим знак) и меняем границу в зависимости от знакопеременности)

P.S. получится куча замен границ каждый раз)) будешь сужать отрезок)) пока чудом не попадешь в нужное приближение корня :)

Ссылка на комментарий

 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;
}

и он работает неправильно...кароче, корни выводятся неверные.помогите кто чем может:(последнее задание для зачета к пятнице:)

Ссылка на комментарий

метод хорд

 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);

Ссылка на комментарий
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

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...