Задача 3. Программирование алгоритмов с итерационными циклами
На интервале значений (0,1) найти с точностью ξ=10-5 корни уравнения
x2-0,5=0 методом деления отрезка пополам.
Описание метода
Уравнение представить в виде f(х)=0. За нулевое приближение корня уравнения принять x0=(a+b)/2. Если f(x0)=0, то x0 является корнем уравнения. Если f(x0)≠0, то проверить условия f(x0)×f(b)<0 и f(x0)×f(a)<0 и выбрать тот из отрезков [a, х0],[х0, b], на границах которого выполнено одно из этих условий (т.е. функция f(х) имеет противоположные знаки).
Выбранный отрезок вновь разделить пополам и вычислить значение x1.
Для х1 проверить условие f(х1)=0 и, если необходимо, f(х1)≠0 и т. д. Процесс деления отрезков пополам продолжить до тех пор, пока длина отрезка, на концах которого функция имеет противоположные знаки, не будет меньше e. На печать дополнительно вывести значения f(xk) и |ak-bk|.
Блок-схема
Программирование на языке Visual Basic
Создаем форму следующего вида, с данными элементами управления
Свойство “Caption” объекта “Label1” изменяем на “a=”.
Свойство “Caption” объекта “Label2” изменяем на “b=”.
Свойство “Caption” объекта “Label3” изменяем на “eps=”.
Свойство “Caption” объекта “Label4” изменяем на “Корень =”.
Свойство “Caption” объекта “Label5” изменяем на “”.
Свойство “Caption” объекта “Label6” изменяем на “”.
Свойство “Caption” объекта “Label7” изменяем на “”.
Свойство “Caption” объекта “CommandButton1” изменяем на “Вычислить”.
Тогда форма примет вид:
На нажатие объекта “CommandButton1” определим следующую процедуру:
Private Sub CommandButton1_Click()
a = Val(TextBox1.Text)
b = Val(TextBox2.Text)
eps = Val(TextBox3.Text)
Do
c = (a + b) / 2
If (a ^ 2 - 0.5) * (c ^ 2 - 0.5) > 0 Then
a = c
Else
b = c
End If
Label6.Caption = Label6.Caption & c & Chr(13)
Label7.Caption = Label7.Caption & (a - b) & Chr(13)
Loop While Abs(a - b) > eps
Label5.Caption = c
End Sub
Запуск программы: “Run” – “Run”
Программирование на языке Borland C++
#include <iostream.h>
#include <math.h>
int main() {
float a, b, c;
float eps;
cout << "Введите числа a, b и eps: ";
cin >>a>>b>>eps;
do {
c=(a+b)/2;
if ((a*a-0.5)*(c*c-0.5)>0)
a=c;
else
b=c;
cout << (a+b)/2;
cout << endl;
} while (fabs(a-b) < eps);
cout << c;
cout << endl;
return 0;
}
Запуск программы: “Run” – “Run”
Программирование на языке Borland Delphi (консольный режим)
Program z3;
Var a,b,eps,x,f:real;
Begin
Write(‘Введите числа a, b и eps : ’);
Readln(a,b,eps);
repeat
c=(a+b)/2;
if (a*a-0.5)*(c*c-0.5)>0 then
a = c
else
b = c;
writeln(“ c = “,c,“ (a-b)= “,(a-b));
until abs(a-b)<=eps
writeln(“ Корень уравнения = “,c);
End.
Запуск программы: “Run” – “Run”
Другие методы решения уравнений
1. Метод простой итерации
Уравнение представить в виде x= φ(x). Принять, что корень уравнения в нулевом приближении x0 равен, например, x0=m. Первое приближение вычислить по формуле: x1= φ(x0), второе – x2= φ(x1), третье – x3= φ(x2)
и т.д.
2. Метод Ньютона (метод касательных)
Уравнение представить в виде f(х)=0. За корень уравнения в нулевом приближении x0 принять значение границы интервала задания x, для которой выполнено условие: f(x)×f’’(x)>0. Корень уравнения вычислить по формуле:
xk= xk-1 - f(xk-1) / f’(xk-1) .
3. Модифицированный метод Ньютона
Уравнение представить в виде f(х)=0. За корень уравнения в нулевом приближении x0 принять значение границы интервала задания x, для которой выполнено условие: f(x)×f’’(x)>0. Корень уравнения вычислить по формуле: xk= xk-1 - f(xk-1) / f’(x0). Здесь f’(x0) достаточно вычислить один раз. Метод применяется при трудностях в вычислении производных от функции.
4. Метод хорд
Уравнение представить в виде f(х)=0. Итерационная формула вычисления корня уравнения имеет вид:
5. Комбинированный метод
Уравнение представить в виде f(х)=0. За нулевое приближение корня уравнения по методу хорд принять x0=m, по методу Ньютона .
Итерационная формула метода хорд на первом шаге имеет вид:
.
Итерационная формула метода Ньютона на первом шаге имеет вид:
на втором шаге
На (k+1)-м шаге формулы имеют вид:
.
Погрешность на каждом шаге вычислить по формулам:
.
На печать дополнительно вывести значения .