Методи розв’язування одновимірних та багатовимірних нелінійних оптимізаційних задач та задач лінійного цілочислового програмування
6. Вихідний код програми
Нижче приведемо код програми для знаходження мінімуму фіункції за допомогою методу золотого перерізу і методу Фібоначчі, реалізований в С++. Результат виконання програми виводить в окремий текстовий документ Solution.txt.
· Метод золотого перерізу
// zoloto.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
double g[5]={0};
double a,b;
double E=0;
void Inputkoef()
{
for (int i=0;i<5;i++)
{
cout<<"Enter a value a["<<i+1<<"] : ";
cin>>g[i];
}
}
void Inputotrez()
{
cout<<"Enter the lower limit segment a=";
cin>>a;
cout<<"Enter the upper limit of the interval b=";
cin>>b;
cout<<"enter the calculation accuracy E=";
cin>>E;
}
double f(double x)
{
return (g[0]*pow(x,4)+g[1]*pow(x,3)+g[2]*pow(x,2)+g[3]*x+g[4]);
}
double f(double);
ofstream Out;
int main(int argc, char* argv[])
{
cout<<"function has the form: a1*x^4+a2*x^3+a3*x^2+a4*x+a5->min"<<endl;
Inputkoef();
Inputotrez();
double x,xk,yk,k;
k=0;
xk=a+((3-pow(5,0.5))/2)*(b-a);
yk=a+b-xk;
Out.open("Solution.txt");
cout << "Solution of the golden section method: ";
Out << "Solution of the golden section method: ";
cout << "k a b Xk Yk F(Xk) F(Yk) ";
Out << "k a b Xk Yk F(Xk) F(Yk) ";
do
{
cout << k << " " << a << " " << b << " " << xk << " " << yk << " " << f(xk) << " " << f(yk) << endl;
Out << k << " " << a << " " << b << " " << xk << " " << yk << " " << f(xk) << " " << f(yk) << endl;
if(f(xk)<=f(yk))
{
b=yk;
yk=xk;
xk=a+b-xk;
}
else if(f(xk)>f(yk))
{
a=xk;
xk=yk;
yk=a+b-yk;
}
k++;
}
while (abs(b-a)>E);
cout << k << " " << a << " " << b << " " << xk << " " << yk << " " << f(xk) << " " << f(yk) << endl;
Out << k << " " << a << " " << b << " " << xk << " " << yk << " " << f(xk) << " " << f(yk) << endl;
x=(a+b)/2;
cout<< "x = " << x << " f(x) = " << f(x);
Out<< "x = " << x << " f(x) = " << f(x);
Out.close();
return 0;
}
Результат виконання програми при введенні даних, що відповідать завданню цієї курсової роботи:
· Метод Фібоначчі
// fib.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
double PoslidovnistFib(double);
double g[5]={0};
double a,b;
double E=0;
void Inputkoef()
{
for (int i=0;i<5;i++)
{
cout<<"Enter a value a["<<i+1<<"] : ";
cin>>g[i];
}
}
void Inputotrez()
{
cout<<"Enter the lower limit segment a=";
cin>>a;
cout<<"Enter the upper limit of the interval b=";
cin>>b;
cout<<"enter the calculation accuracy E=";
cin>>E;
}
double f(double);
double f(double x)
{
return (g[0]*pow(x,4)+g[1]*pow(x,3)+g[2]*pow(x,2)+g[3]*x+g[4]);
};
ofstream Out;
int main(int argc, char* argv[])
{
cout<<"function has the form: a1*x^4+a2*x^3+a3*x^2+a4*x+a5->min"<<endl;
Inputkoef();
Inputotrez();
int d,k=0,p=0;
double eps,x,y,N=-1,kk=1.0;
eps = 0.00001 ;
Out.open("Solution.txt");
cout << "Solution of Fibonachi method: ";
Out << "Solution of Fibonachi method: ";
double L0=b-a;
do
{
N++;
}
while (PoslidovnistFib(N)<(abs(L0)/E));
cout << "N = " << N << endl;
Out << "N = " << N << endl;
cout << "k a b Xk Yk F(Xk) F(Yk) ";
Out << "k a b Xk Yk F(Xk) F(Yk) ";
x=a+(PoslidovnistFib(N-2)/PoslidovnistFib(N))*(b-a);
y=a+(PoslidovnistFib(N-1)/PoslidovnistFib(N))*(b-a);
cout << k << " " << a << " " << b << " " << x << " " << y << " " << f(x) << " " << f(y) << endl;
Out << k << " " << a << " " << b << " " << x << " " << y << " " << f(x) << " " << f(y) << endl;
do
{
if (f(x)<=f(y))
{
b=y;
y=x;
x=a+(PoslidovnistFib(N-k-3)/PoslidovnistFib(N-k-1))*(b-a);
}
else if (f(x)>f(y))
{
a=x;
x=y;
y=a+(PoslidovnistFib(N-k-2)/PoslidovnistFib(N-k-1))*(b-a);
};
k++;
cout << k << " " << a << " " << b << " " << x << " " << y << " " << f(x) << " " << f(y) << endl;
Out << k << " " << a << " " << b << " " << x << " " << y << " " << f(x) << " " << f(y) << endl;
}
while(k!=N-3);
k = 0;
cout << " Fi(N) = " << PoslidovnistFib << endl;
Out << " Fi(N) = " << PoslidovnistFib << endl;
do
{
cout << "k = " << k << " Fi(N-k-1) = " << PoslidovnistFib(N-k-1) << " Fi(N-k-2) = " << PoslidovnistFib(N-k-2) << " Fi(N-k-3) = " << PoslidovnistFib(N-k-3) << endl;
Out << "k = " << k << " Fi(N-k-1) = " << PoslidovnistFib(N-k-1) << " Fi(N-k-2) = " << PoslidovnistFib(N-k-2) << " Fi(N-k-3) = " << PoslidovnistFib(N-k-3) << endl;
k++;
}
while(k!=N-3);
y=x+eps;
if (f(x)<=f(y))
{
b=y;
}
if (f(x)>f(y))
{
a=x;
};
x = (b+a)/2;
cout << "x = " << x << " f(x) = " << f(x) <<endl;
Out << "x = " << x << " f(x) = " << f(x) <<endl;
Out.close();
return 0;
}
double PoslidovnistFib(double n)
{
double f0,fk,p;
f0=1;
fk=1;
for(int i=2;i<=n;i++)
{
p=fk;
fk=fk+f0;
f0=p;
}
if (n<2)
{
fk=1;
}
return fk;
};
Результат виконання рограми:
Solution of Fibonachi method:
N = 17
kabXkYkF(Xk)F(Yk)
0020.7639321.23607-50.8575-59.9845
10.76393221.236071.52786-59.9845-53.5866
20.7639321.527861.055731.23607-58.9696-59.9845
31.055731.527861.236071.34752-59.9845-58.8184
41.055731.347521.167181.23607-59.998-59.9845
51.055731.236071.124611.16718-59.7535-59.998
61.124611.236071.167181.1935-59.998-60.0537
71.167181.236071.19351.20975-60.0537-60.0508
81.167181.209751.183441.1935-60.0411-60.0537
91.183441.209751.19351.19969-60.0537-60.056
101.19351.209751.199691.20356-60.056-60.0553
111.19351.203561.197371.19969-60.0556-60.056
121.197371.203561.199691.20124-60.056-60.0559
131.197371.201241.198921.19969-60.0559-60.056
141.198921.201241.199691.20046-60.056-60.056
Fi(N) = 004112A8
k = 0Fi(N-k-1) = 1597Fi(N-k-2) = 987Fi(N-k-3) = 610
k = 1Fi(N-k-1) = 987Fi(N-k-2) = 610Fi(N-k-3) = 377
k = 2Fi(N-k-1) = 610Fi(N-k-2) = 377Fi(N-k-3) = 233
k = 3Fi(N-k-1) = 377Fi(N-k-2) = 233Fi(N-k-3) = 144
k = 4Fi(N-k-1) = 233Fi(N-k-2) = 144Fi(N-k-3) = 89
k = 5Fi(N-k-1) = 144Fi(N-k-2) = 89Fi(N-k-3) = 55
k = 6Fi(N-k-1) = 89Fi(N-k-2) = 55Fi(N-k-3) = 34
k = 7Fi(N-k-1) = 55Fi(N-k-2) = 34Fi(N-k-3) = 21
k = 8Fi(N-k-1) = 34Fi(N-k-2) = 21Fi(N-k-3) = 13
k = 9Fi(N-k-1) = 21Fi(N-k-2) = 13Fi(N-k-3) = 8
k = 10Fi(N-k-1) = 13Fi(N-k-2) = 8Fi(N-k-3) = 5
k = 11Fi(N-k-1) = 8Fi(N-k-2) = 5Fi(N-k-3) = 3
k = 12Fi(N-k-1) = 5Fi(N-k-2) = 3Fi(N-k-3) = 2
k = 13Fi(N-k-1) = 3Fi(N-k-2) = 2Fi(N-k-3) = 1
x = 1.20046f(x) = -60.056