Steffensen(n, eps, count, x, y);

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;

}

Результат работы программы:

Steffensen(n, eps, count, x, y); - student2.ru

Таким образом,

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; }

Результат работы программы:

Steffensen(n, eps, count, x, y); - student2.ru

Таким образом,

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;

}

Результат работы программы:

Steffensen(n, eps, count, x, y); - student2.ru

Таким образом,

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; }

Результат работы программы:

Steffensen(n, eps, count, x, y); - student2.ru

Таким образом,

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. обратиться к программе вычислений:

Наши рекомендации