Текущий архив: 2002.12.26;
Скачать: CL | DM;
ВнизВыч Мат Найти похожие ветки
← →
Svin (2002-12-04 12:44) [0]Народ помогите пожалуйста по выч мату срочно нужно здавать задачу ссесия на носу
а я немогу додумать задачку
задача
решить уранение ctg(x)=a/x
методом хорд
в общем не для своего уравнения я написал
на какомто сайте нащел доку по этому методу и написал
там задача рассматривалась на немного изогнутой прямой левая граница которой ниже оси ох а правая выше ох
и точно известно что будет только один корень т.к эта загагулина пересекает ось ох один раз
вот код
Program METODHORD;
Uses Crt,Graph;
Var
a,b:Integer;{лево право}
N:Real;{Коафицент а}
Key:Char;
J:Real;{Координата пересечения хорды с ох}
acc:Real;{Точность}
Temp,Tempj:Real;
{ГР}
{Ввод информации}
Procedure GetAll;
Begin
ClrScr;
Write("Введите коэфицент а");
ReadLn(N);
WriteLn("Вводи а");
ReadLn(a);
WriteLn("Вводи b");
ReadLn(b);
WriteLn("Введи точность");
ReadLn(acc);
End;
{Уравнение}
Function Fx(x:real):Real;
Begin
Fx:=N/X - cos(x)/sin(x);
End;
{Вычисление Методом хорд}
Procedure Calculate;
Begin
J:=a-(Fx(a)*(b-a))/(Fx(b)-Fx(a));
Temp:=Fx(j);
While Temp>=acc do
Begin
TempJ:=j;
J:=(-1) * (Temp * (b-TempJ) / (Fx(b)-temp)+TempJ);
Temp:=Fx(j);
End;
Write("х = ");
WriteLn(Temp:10:8);
write("С точностью ");
WriteLn(acc:10:8);
End;
Begin
GetAll;
Calculate;
key:=ReadKey;
Until Key in ["Q","q"];
ReadKey;
End.
а в моём уравнение почти такаяже загагулина только их дахрена
и препод вводит промежуток а и б так как ему захочется
тоесть на этом промежутке будет несколько загагулин и значит несколько ответов
я уже голову сломал никак немогу предумать помогите а может код модифицырут кто нить
если надо могу описать метод
Заранее благадарен
← →
AFrolov (2002-12-04 13:50) [1]В общем случае наличия на интервале нескольких корней - интервал разбивается на такое число непересекающихся интервалов. Это можно сделать несколькими способами исходя из дополнительной информации о функции.
← →
Александр Спелицин (2002-12-04 14:56) [2]Вообще-то доказательство истинности численного решения уравнения f(x) = 0 на отрезке [a, b] различными методами предполагает выполнение ряда условий для ф-ции f(x)на [a, b]. Для метода деления отрезка пополам и метода хорд достаточно, чтобы функция была непрерывной. А вот для метода касательных - f(x) должна быть уже диффиренцируемой на этом отрезке. Насчет непрерывности ctg(x) на любом отрезке я сомневаюсь :-). Так что в случае затыка программы или глупого вопроса преподавателя грамотный ответ будет такой: На данном отрезке [a, b] ур-нение f(x) = 0 решить методом хорд НЕЛЬЗЯ. Их этого вовсе не следует, что уравнение вообще не имеет корней на данном отрезке, просто не выполненяются необходимые условия для решения этим методом. А также нужна уверенность в своей правоте :o)!
← →
Svin (2002-12-05 01:18) [3]Дело в том что я уже 3 раза говорил преподу что мою ф-ию нельзя решить методом хорд но она меня неслушает и говорит что функция непрерывна ну народ помогите же а а то у меня осталось ещё 4 задания и 2 занятия чтобы их здать
← →
zavdim (2002-12-05 11:24) [4]1. У этой функции есть области непрерывности. (pi*n,pi*(n+1)).
2. Нехорошее место - 0. Здесь лучше повозиться на бумаге - с ходу не скажу (там видимо от а зависит, при отрицательном корень в районе 0 точно есть, а при положительном (?) - повозится надо). Если он входит в промежуток даваемый преподом, то разбивай на 2 промежутка одного знака и смело выкидывай промежуток от -pi/2 до pi/2. С этим промежутком - работай отдельно.
3. Далее строй пересечения твоего промежутка с промежутками вида
(pi*n+е,pi*(n+1)-е). Где е - бери маленькое (к сожалению есть зависимость от а если а очень большое, то е - должно быть меньше).
4. И на получившихся промежутках применяй метод хорд.
Время будет прогу сошкрябаю, но ты уж и сам не плошай.
← →
zavdim (2002-12-05 13:39) [5]Что-то вроде этого (только я деление пополам использую):
A,B,C - твои константы - в проге видимо есть дырочки, но пока времени нет искать - поищи сам. Желаю удачи.
const
epsilon1 = 0.01;
epsilon2 = 0.0001;
step = 0.11111;
function f(x : extended):extended;
begin
Result := cos(x)/sin(x)-C/x
end;
function PointIsGood(x : extended):boolean;
begin
Result := abs((abs(x)-round(abs(x)/pi)*pi))>epsilon1
end;
function RangeIsGood(aa,bb: extended): boolean;
begin
Result := ((abs(bb)-round(abs(bb)/pi)*pi)*(abs(aa)-round(abs(aa)/pi)*pi))>0
end;
function Root(a,b : extended): extended;
var x,y,fa:extended;
begin
fa:=f(a);
y:=2*epsilon2;
x := a;
while abs(y)>epsilon2 do
begin
x:=(a+b)/2;
y:=f(x);
if fa*y<0
then b:=x
else begin
a:=x;
fa:=y
end
end;
Result:=x
end;
procedure VivResult(y : extended);
begin
-------------
end;
procedure Find;
var FA,FB,X,Y : extended;
begin
while A<B do
begin
FA := f(a);
x := a + step;
if PointIsGood(x)and(RangeIsGood(a,x)) then
begin
FB := f(x);
if FA*FB<0 then
begin
y := Root(a,x);
VivResult(y)
end;
a := x;
end else
begin
a := a+2*step
end
end;
end;
← →
zavdim (2002-12-06 05:14) [6]При а>=1 корней от -пи до пи нет. В остальных случаях - 2 штуки.
Страницы: 1 вся ветка
Текущий архив: 2002.12.26;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.007 c