Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2007, 20:14   #1
Raz0r
Пользователь
 
Регистрация: 06.11.2007
Сообщений: 47
По умолчанию Метод касательных

Помогите с задачкой, нужно найти корень уравнения методом касательных, впринципе само решение, насколько я понял, в следующем коде
Код:
while (x>e)
    x=x-f(x)/f1(x);
где е - точность
f(x)-значение функции в точке х
f1(x)-значение х в производной от функции
х -точка из которой провели касательную
Но у меня почему то программа зацикливается после первого прохода... В чём ошибка?
Raz0r вне форума Ответить с цитированием
Старый 09.11.2007, 20:28   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Замени while (abs(f(x))>e)

Последний раз редактировалось _Dmitry; 09.11.2007 в 20:31.
_Dmitry вне форума Ответить с цитированием
Старый 11.11.2007, 18:47   #3
Raz0r
Пользователь
 
Регистрация: 06.11.2007
Сообщений: 47
По умолчанию

Не помогло, условие сразу выполняется и он выводит точку, откуда касательная проведена...
Raz0r вне форума Ответить с цитированием
Старый 11.11.2007, 18:48   #4
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Тогда приведи код полностью
_Dmitry вне форума Ответить с цитированием
Старый 11.11.2007, 18:50   #5
Raz0r
Пользователь
 
Регистрация: 06.11.2007
Сообщений: 47
По умолчанию

Код:
#include<stdio.h>
#include<conio.h>
#include<math.h>

float f (float xf)
{
 return exp(-xf*xf+1)+xf-3;
}

float f1 (float xf1)
{
 return -2*xf1*exp(-xf1*xf1+1)+1;
}

float f2 (float xf2)
{
 return (4*xf2*xf2-2)*exp(-xf2*xf2+1);
}

void main()
{
float a, b, e, x, y;
clrscr();
printf("Input interval (a,b) and accuracy E:\n");
scanf("%f%f%f", &a, &b, &e);
if (f(a)*f(b)>0)
 {printf("There are no roots.\n");
  getch();
  return;
 }
 else if (f2(a)*f(a)>0) x=a;
  else x=b;
  while (abs(f(x))>e)
    x=x-f(x)/f1(x);
printf("Root of a equation is %2.3f", x);
getch();
}
Raz0r вне форума Ответить с цитированием
Старый 11.11.2007, 19:02   #6
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Что такое f2 я так и не понял. Убери эту функцию исправь
else if (f(a)*f1(a)>0) x=a;
_Dmitry вне форума Ответить с цитированием
Старый 11.11.2007, 19:05   #7
Raz0r
Пользователь
 
Регистрация: 06.11.2007
Сообщений: 47
По умолчанию

Это функция проверяет мою функцию на выпуклость/вогнутость, там мне заданы координаты отрезка, и это условие определяет из какой точки касательную проводить. А вот дальше проблемы начинаются...
Raz0r вне форума Ответить с цитированием
Старый 11.11.2007, 19:08   #8
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Это же самое делается через производную
Код:
if (f(a)*f1(a)>0) x=a;
  else x=b;
теперь ведь работает, результат 3
_Dmitry вне форума Ответить с цитированием
Старый 11.11.2007, 19:17   #9
Raz0r
Пользователь
 
Регистрация: 06.11.2007
Сообщений: 47
По умолчанию

А не через вторую производную? f2 - это она и есть. Попробовал как ты написал, результат тот же, а что с while делать, ума не приложу...
Raz0r вне форума Ответить с цитированием
Старый 11.11.2007, 19:25   #10
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Окончательный код вот
Код:
#include<stdio.h>
#include<conio.h>
#include<math.h>

float f (float xf)
{
 return exp(-xf*xf+1)+xf-3;
}

float f1 (float xf1)
{
 return -2*xf1*exp(-xf1*xf1+1)+1;
}

void main()
{
float a, b, e, x, y;
clrscr();
printf("Input interval (a,b) and accuracy E:\n");
scanf("%f%f%f", &a, &b, &e);
if (f(a)*f(b)>0)
 {printf("There are no roots.\n");
  getch();
  return;
 }
 else if (f(a)*f1(a)>0) x=a;
  else x=b;
  while (abs(f(x))>e)
    x=x-f(x)/f1(x);
printf("Root of a equation is %2.3f", x);
getch();
}
по условию, решается задача поиска корня уравнения f(x)=0 на отрезке [a,b], цикл
Код:
  while (abs(f(x))>e)
    x=x-f(x)/f1(x);
выполняется, пока f(x)>e, когда становится f(x)<=e расчет заканчивается
_Dmitry вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод вижинера Ghost_Dante Помощь студентам 12 01.12.2011 21:58
Метод Гаусса IgorKr Помощь студентам 10 03.02.2008 11:28