9. вывести на экран терминала (в текстовый файл) вектор решения x[n] и вектор невязок y[n].
Пример: решить систему уравнений
3x12 + 1,5x22 - x32 - 5 = 0;
6x1x2x3 - x1 + 5x2 + 3x3 = 0;
5x1x3 - x2x3 - 1 = 0;
В этом случае n=3, eps=1.0e-6, count=20.
Начальные приближения неизвестных:
x1=0.1, x2=0.2, x3=0.3
Система уравнений описывается в функции:
void pr_chasti(int n, float x[n], float b[n])
// описание правых частей системы уравнений в виде
// b[i]=b(x[j]); i,j=0…n-1,
{
b[0]=3.0*x[0]*x[0]+1.5*x[1]*x[1]+x[2]*x[2]-5.0;
b[1]=6.0*x[0]*x[1]*x[2]-x[0]+5.0*x[1]+3.0*x[2];
b[2]=5.0*x[0]*x[2]-x[1]*x[2]-1.0;
}
Головная программа:
#include <stdio.h>
#include <math.h>
#include <conio.h>
int Steffensen(int n, float eps, int count, float x[n], float y[n]);
int main(int argc, char **argv)
{
int n; // количество неизвестных
int count; // заданное количество итераций
float eps; // заданная погрешность вычислений
int i,j; // рабочие переменные
printf("\n kolichestvo neizvestnyh n=");
scanf("%d", &n);
float x[n]; // вектор решения системы уравнений
float y[n]; // вектор невязок
printf("\n vektor nachalnyh priblisheniy:\n");
for (i=0; i<n; i++)
scanf("%f", &x[i]);
printf("\n pogreshn. vychisl. eps=");
scanf("%g", &eps);
printf("\n max kolich. iteraciy count=");
scanf("%d", &count);
Steffensen(n, eps, count, x, y);
printf("\n Reshenie sistemy uravn.:\n");
for (i=0; i<n; i++)
printf("%12.6f", x[i]);
printf("\n");
printf("\n Vektor nevjazok:\n");
for (i=0; i<n; i++)
printf("%e ", y[i]);
printf("\n");
Return 0;
}
Результат работы программы:
Таким образом,
x1=1.2845 x2=0.1298 x3=0.1589
Решение избыточной системы нелинейных и трансцендентных уравнений
обобщенным методом Ньютона
В головной программе необходимо:
1. описать прототип функции решения системы уравнений:
int Newton(int n, int m, int *iter, float eps, float x[n], float y[m], float *s0);
2. ввести значение переменной n – количество неизвестных,
3. ввести значение переменной m (m>=n) – количество уравнений,
4. ввести значение переменной eps – погрешность вычислений,
5. ввести значение переменной count – заданное количество итераций,
6. описать массивы:
float x[n]; // вектор решения системы уравнений
float y[n]; // вектор невязок
7. описать систему уравнений в функции:
void pr_chasti(int n, float x[n], float b[n])
в виде b[i]=b(x[j]); i,j=0…n-1,
8. ввести массив x[n] – вектор начальных приближений неизвестных,
9. обратиться к программе решения системы уравнений:
Newton(n, m, &iter, eps, x, y, &s0);
10. вывести на экран терминала (в текстовый файл) вектор решения x[n], вектор невязок y[n], количество выполненных итераций iter и среднеквадратическую невязку s0.
Пример: решить систему уравнений
x12 + x22 - x3 - 0,5 = 0;
0,75x13 - x2 + x32 + 0,65 = 0;
x1x33 + 0,25 = 0;
В этом случае n=3, eps=1.0e-6, count=20.
Начальные приближения неизвестных:
x1=0.1, x2=0.1, x3=0.1
Система уравнений описывается в функции:
void pr_chasti(int n, float x[n], float b[n])
// описание правых частей системы уравнений в виде
// b[i]=b(x[j]); i,j=0…n-1,
{
b[0]=x[0]*x[0]+x[1]*x[1]-x[2]-0.5;
b[1]=0.75*x[0]*x[0]*x[0]-x[1]+x[2]*x[2]+0.65;
b[2]=x[0]*x[2]*x[2]*x[2]+0.25;
}
Головная программа:
#include <stdio.h>
#include <math.h>
#include <conio.h>
int Newton(int n, int m, int *iter, float eps, float x[n], float y[m], float *s0);
int main(int argc, char **argv)
{
int n; // количество неизвестных
int m; // количество уравнений (m>=n)
int iter; // заданное количество итераций
float eps; // заданная погрешность вычислений
float s0; // среднеквадратическая невязка
int i; // рабочая переменная
printf("\n Kol-vo neizvestn. n=");
scanf("%d", &n);
printf("\n Kol-vo uravnen. (m>=n) m=");
scanf("%d", &m);
float x[n]; // вектор оценок неизвестных
float y[m]; // вектор невязок
printf("\n Kol-vo iteracij iter=");
scanf("%d", &iter);
printf("\n Pogreshn. vychislenij eps=");
scanf("%e", &eps);
printf("\n vvedite vektor nachaln. priblishenij (%d znachenij):\n", n);
for (i=0; i<n; i++)
scanf("%f", &x[i]);
printf("\n");
Newton(n, m, &iter, eps, x, y, &s0);
printf("\nKol-vo iteracij: %d\n", iter);
printf("\n Ocenki neizvestnyh:\n");
for (i=0; i<n; i++)
printf("%10.5f", x[i]);
printf("\n");
printf("\n Vector nevjazok:\n");
for (i=0; i<m; i++)
printf("%e ", y[i]);
printf("\n");
printf("\nSrednekv. nevjazka: %e\n", s0);
return 0; }
Результат работы программы:
Таким образом,
x1=-1.042 x2=0.1867 x3=0.6213
Вычисление комплексных корней алгебраического уравнения
методом Ньютона-Рафсона
В головной программе необходимо:
1. описать прототип функции вычисления корней:
int Newton_Rafson(int n, float q[n+1], float p[2][n]);
2. ввести значение переменной n – степень уравнения,
3. описать массивы:
float q[n+1]; // вектор коэффициентов исходного уравнения
// по возрастанию степеней
float p[2][n]; // массив корней уравнения:
// первая строка – действительные части,
// вторая строка – мнимые части,
4. ввести массив q[n+1] – вектор коэффициентов исходного уравнения,
5. обратиться к программе вычисления корней:
Newton_Rafson(n, q, p);
6. вывести на экран терминала (в текстовый файл) массив корней уравнения
Пример: определить корни алгебраического уравнения
x3 – 3x2 + 4x – 12 = 0
В этом случае n=3, вектор коэффициентов уравнения:
q[4]=(-12, 4, -3, 1).
Головная программа:
#include <stdio.h>
#include <math.h>
#include <conio.h>
int Newton_Rafson(int n, float q[n+1], float p[2][n]);
int main(int argc, char **argv)
{
int n; // степень уравнения
int i; // рабочая переменная
char c; // рабочая переменная
printf("\n stepeny uravnenia n=");
scanf("%d", &n);
float q[n+1]; // вектор коэффициентов исходного уравнения // по возрастанию степеней
float p[2][n]; // массив корней уравнения
printf("\n vektor koefficientov:\n");
for (i=0; i<n+1; i++)
scanf("%f", &q[i]);
Newton_Rafson(n, q, p);
printf("\n Korni uravnenija");
printf("\n Dejstvit. chasti Mnimye chasti \n");
for (i=0; i<n; i++)
printf(" %12.6f %12.6f\n", p[0][i], p[1][i]);
printf("\n");
c=getch();
Return 0;
}
Результат работы программы:
Таким образом,
x1=3.0 x2,3=0.0 ± j 2.0
Вычисление комплексных корней алгебраического уравнения
модифицированным методом Берстоу
В головной программе необходимо:
1. описать прототип функции вычисления корней:
int Bairstow(int n, float q[n+1], float p[2][n]);
2. ввести значение переменной n – степень уравнения,
3. описать массивы:
float q[n+1]; // вектор коэффициентов исходного уравнения
// по возрастанию степеней
float p[2][n]; // массив корней уравнения:
// первая строка – действительные части,
// вторая строка – мнимые части,
4. ввести массив q[n+1] – вектор коэффициентов исходного уравнения,
5. обратиться к программе вычисления корней:
Bairstow(n, q, p);
6. вывести на экран терминала (в текстовый файл) массив корней уравнения
Пример: определить корни алгебраического уравнения
2x3 + 3x2 + 3x + 1 = 0
В этом случае n=3, вектор коэффициентов уравнения:
q[4]=(1, 3, 3, 2).
Головная программа:
#include <stdio.h>
#include <math.h>
#include <conio.h>
int Bairstow(int n, float q[n+1], float p[2][n]);
int main(int argc, char **argv)
{
int n; // степень уравнения
int i; // рабочая переменная
char c; // рабочая переменная
printf("\n stepeny uravnenia n=");
scanf("%d", &n);
float q[n+1]; // вектор коэффициентов исходного
// уравнения по возрастанию степеней
float p[2][n]; // массив корней уравнения:
// первая строка - действит. части,
// вторая – мнимыечасти
printf("\n vektor koefficientov:\n");
for (i=0; i<n+1; i++)
scanf("%f", &q[i]);
Bairstow(n, q, p);
printf("\n Korni uravnenija");
printf("\n Dejstvit. chasti Mnimye chasti \n");
for (i=0; i<n; i++)
printf(" %12.6f %12.6f\n", p[0][i], p[1][i]);
printf("\n");
c=getch();
return 0; }
Результат работы программы:
Таким образом,
x1=-2.0 x2,3=-0.5 ± j 0.866
Вычисление коэффициентов интерполяционного полинома Лагранжа
В головной программе необходимо:
1. описать прототип функции:
void interpol_Lagrang(int n, float x[n], float y[n], float q[n]);
2. ввести значение переменной n – количество узлов интерполяции,
3. описать массивы:
float x[n], y[n]; // значения аргумента и функции
// в узлах интерполяции
float q[n]; // вектор коэффициентов
// интерполяционного полинома Лагранжа
// по возрастающим степеням
4. ввести массивы x [n], y[n],
5. обратиться к программе вычислений: