Суть задачи: С заданной точностью eps найти наименьший положительный корень уравнения tgx=x с помощью метода деления отрезка пополам....
Собственно вопрос заключается в решение уравнения tgx=x, не знаю как решить...что задавать...
Помогите пжлст чем можете, прогу можно написать на C++ или Pascal(в принципе не важно, но лучше на паскале)
Метод деления отрезка пополам
Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill
[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]
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]
Еще один вопросец небольшой: как сделать так чтобы каждый раз на клавишу не нажимать, чтобы получить очередной x, а сразу наименьший положительный корень???
Убрать процедуру OutputRes ???
Программа работает не при всех значениях a и b, потому что tgx лежит на конкретном промежутке???
Убрать процедуру OutputRes ???
Программа работает не при всех значениях a и b, потому что tgx лежит на конкретном промежутке???
1. Убрать по тексту все OutputRes, поставить после finish (перед последним end.)
2. Главное, чтобы функция была непрерывна на [a,b] и f(a)*f(b) < 0. Вроде так.
2. Главное, чтобы функция была непрерывна на [a,b] и f(a)*f(b) < 0. Вроде так.
Переделал код в Паскале вот так:
Мне так показалось проще и более конкретнее...Работает все как часы....
Но теперь требуется помощь в написании этого же кода, но в C++ (просто cpp написать, на спросили на версии BC++ 3.1, но можно на любой другой, главное чтоб функции были одинаковыми)...Поэтому за неимением времени(т.к сдавать нужно уже скоро)...обращаюсь к вам в надежде что вы мне хоть чем-то поможете!!!
Заранее САПСИБО БОЛЬШУЩЕЕ!!!
Код: Выделить всё
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, но можно на любой другой, главное чтоб функции были одинаковыми)...Поэтому за неимением времени(т.к сдавать нужно уже скоро)...обращаюсь к вам в надежде что вы мне хоть чем-то поможете!!!
Заранее САПСИБО БОЛЬШУЩЕЕ!!!
Alex Burn помоги пожалуйста, если можешь!!!
[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 не уверен.
//---------------------------------------------------------------------------
#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
Помогите пожалуйста, в Mathematica:
решить уравнение arccos (1/√e) методом деления отрезка пополам с заданной точностью эпсиум=10^(-2),10^(-3),10^(-4) на соответствующих отрезках, найти корни, вызывать функцию 3 раза, т.е. 3 раза разделить пополам.
решить уравнение arccos (1/√e) методом деления отрезка пополам с заданной точностью эпсиум=10^(-2),10^(-3),10^(-4) на соответствующих отрезках, найти корни, вызывать функцию 3 раза, т.е. 3 раза разделить пополам.