Метод деления отрезка пополам

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

07 сен 2008, 18:35

Суть задачи: С заданной точностью eps найти наименьший положительный корень уравнения tgx=x с помощью метода деления отрезка пополам....
Собственно вопрос заключается в решение уравнения tgx=x, не знаю как решить...что задавать...

Помогите пжлст чем можете, прогу можно написать на C++ или Pascal(в принципе не важно, но лучше на паскале)
Аватара пользователя
Alex_Burn
Сообщения: 145
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

07 сен 2008, 19:57

[Syntax='Pascal']
uses crt;
label finish;
var a,b,d,e,x1,fa,f1 : real;
ch : char;
function f(x:real):real;
begin
f := sin(x)/cos(x) - x;
end;
procedure OutputRes;
begin
clrscr;
writeln('x = ',x1:6:4);
writeln('Погрешность* = ',d:6:4);
writeln; writeln('Для продолжения нажмите любую клавишу...');
repeat ch := readkey until ch <> '';
end;

BEGIN
clrscr;
writeln('Введите координаты концов отрезка* a, b, точность e');
write('a = '); readln(a);
write('b = '); readln(b);
write('e = '); readln(e);
if f(a)*f(b) > 0 then goto finish;
repeat
x1 := (a + b)/2; f1 := f(x1);
if f1 = 0 then
begin
d := 0;
OutputRes;
goto finish;
end;
fa := f(a);
if fa * f1 < 0 then b := x1 else a := x1;
d:= b - a;
OutputRes;
until d < e;
finish : END.
[/Syntax]
DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

07 сен 2008, 20:42

Спасибо дружище!
DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

07 сен 2008, 21:03

Еще один вопросец небольшой: как сделать так чтобы каждый раз на клавишу не нажимать, чтобы получить очередной x, а сразу наименьший положительный корень???
Убрать процедуру OutputRes ???
Программа работает не при всех значениях a и b, потому что tgx лежит на конкретном промежутке???
Аватара пользователя
Alex_Burn
Сообщения: 145
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

07 сен 2008, 21:18

1. Убрать по тексту все OutputRes, поставить после finish (перед последним end.)
2. Главное, чтобы функция была непрерывна на [a,b] и f(a)*f(b) < 0. Вроде так.
DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

16 сен 2008, 13:41

Переделал код в Паскале вот так:

Код: Выделить всё

program rock;
uses crt;
 var a,b,d,e,x1,fa,f1 : real;
 function f(x:real):real;
  begin
   f := sin(x)/cos(x) - x;
  end;
  BEGIN
   clrscr;
   write('Vvedite a:'); readln(a);
   write('Vvedite b:'); readln(b);
   write('Vvedite tochnost e:'); readln(e);
   if f(a)*f(b) > 0 then exit;
   repeat
    x1 := (a + b)/2; f1 := f(x1);
    if f1 = 0 then
      d := 0;
    fa := f(a);
    if fa * f1 < 0 then b := x1 else a := x1;
    d:= b - a;
  until abs(d) < e;
  writeln('Koren= ',x1:6:4);
  writeln('Pogreshost= ',d:6:4);
  readln;
end.
Мне так показалось проще и более конкретнее...Работает все как часы....
Но теперь требуется помощь в написании этого же кода, но в C++ (просто cpp написать, на спросили на версии BC++ 3.1, но можно на любой другой, главное чтоб функции были одинаковыми)...Поэтому за неимением времени(т.к сдавать нужно уже скоро)...обращаюсь к вам в надежде что вы мне хоть чем-то поможете!!!

Заранее САПСИБО БОЛЬШУЩЕЕ!!!
DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

17 сен 2008, 16:42

Alex Burn помоги пожалуйста, если можешь!!!
Аватара пользователя
Alex_Burn
Сообщения: 145
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

17 сен 2008, 18:16

[Syntax='C++']
//---------------------------------------------------------------------------

#pragma hdrstop
#include <iostream.h>
#include <math.h>

//---------------------------------------------------------------------------

#pragma argsused
float f(float x)
{
return (tan(x) - x);
}

void main()
{
float a, b, e, x1, f1, d, fa;
cout << "Input A -> "; cin >> a; cout << endl;
cout << "Input B -> "; cin >> b; cout << endl;
cout << "Input Precision E -> "; cin >> e; cout << endl;
if (f(a)*f(b)>0) exit(1);
do
{
x1 = (a + b)/2; f1 = f(x1);
if (f1 == 0) d = 0;
fa = f(a);
if (fa * f1 < 0) b=x1; else a=x1;
d=b-a;
}
while (fabs(d) > e);
cout << "Root = " << x1 << endl;
cout << "Mistake = " << d << endl;
getchar();
getchar();
}
//---------------------------------------------------------------------------
[/Syntax]

Замечание. Если у вас в чем-то затруднения, выкладывайте свой код и задавайте конкретные вопросы по коду..
P. S. Кодил на ВСВ 6. Насчет совместимости с ВСВ 3.1 не уверен.
АнастасияЯ
Сообщения: 4
Зарегистрирован: 21 дек 2013, 23:04

21 дек 2013, 23:57

Помогите пожалуйста, в Mathematica:
решить уравнение arccos (1/√e) методом деления отрезка пополам с заданной точностью эпсиум=10^(-2),10^(-3),10^(-4) на соответствующих отрезках, найти корни, вызывать функцию 3 раза, т.е. 3 раза разделить пополам.
Ответить