- •1. Решение систем линейных алгебраических уравнений (слау)
- •Решение:
- •2.Аппроксимация функций
- •Решение:
- •3. Вычисление производных и интегралов
- •Решение:
- •4. Методы решения нелинейных уравнений
- •Решение:
- •5. Методы нахождения минимума функции одной переменной
- •Решение:
- •6. Решение задачи Коши для обыкновенных дифференциальных уравнений Варианты заданий
5. Методы нахождения минимума функции одной переменной
Требуется отладить программу определения минимума указанной в таблице функции заданным методом. Сначала на экране выдается таблица значений функции и делается запрос на ввод начального приближения (, или x0, h) для вычисления требуемого локального минимума. Расчет функции, а также метод нахождения минимума оформить в виде отдельных подпрограмм. Выбрать m - по усмотрению, точность =10-4 .
N |
f(x) |
Интервал |
метод |
|
а |
b |
|||
5 |
|
4 |
20 |
MP3 |
Решение:
Код программы приведен в листинге 5.1.
Результаты работы программы приведены на рис. 5.1.
Листинг 5.1
// Ganisevsky5_MP3.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
double countF(double x1)
{
return pow(x1,0.5)-cos(x1);
}
double countD(double x1d)
{
return 1/(2*pow(x1d,0.5))+sin(x1d);
}
double MP3(double a, double b, double e)
{
int m1=200;
double x1,x2,x3,h1,z1;
double zm=0;
double D1,D2,Y1,Y2,Y3,r,p,q,podkor;
h1=(b-a)/m1;
x1=a;
D1=countD(x1);
if (D1<0)
h1=-h1;
x2=x1+h1;
D2=countD(x2);
Y1=countF(x1);
Y2=countF(x2);
do
{
z1=x1-x2;
r=D2;
p=(D1-D2-2*(Y1-Y2-D2*z1)/z1)/(z1*z1);
q=(D2-D1+3*(Y1-Y2-D2*z1)/z1)/z1;
podkor=q*q-3*p*r;
if (podkor<0)
zm=-q/(3*p);
else
zm=(-q+sqrt(podkor))/(3*p);
x1=x2;
Y1=Y2;
D1=D2;
x2=x2+zm;
Y2=countF(x2);
D2=countD(x2);
}
while(fabs(zm)>e);
x3=x2+zm;
Y3=countF(x3);
return x3;
}
int _tmain(int argc, _TCHAR* argv[])
{
int ans;
double a1=4,b1=20,m=20,x,y,h1,a2,rez,b2,e1=0.0001;
h1=(b1-a1)/m;
x=a1;
cout<<"x \t y"<<endl;
while(x<b1+0.1)
{
y=countF(x);
cout<<x<<"\t"<<y<<endl;
x=x+h1;
}
do
{
cout<<"Enter a:"<<endl;
cin>>a2;
cout<<"Enter b:"<<endl;
cin>>b2;
rez=MP3(a2,b2,e1);
cout<<"Minimum is: "<<rez<<endl;
ans=1;
cout<<"Find more minimums? "<<endl<<"'1'-YES"<<endl<<"'0'-NO"<<endl;
cin>>ans;
}
while(ans!=0);
return 0;
}
Рис. 5.1
6. Решение задачи Коши для обыкновенных дифференциальных уравнений Варианты заданий
Составить программу для решения задачи Коши.
Решить задачу для системы двух уравнений в соответствии с вариантом (табл. 7.1):
Точное решение этой задачи при одинаково для всех вариантови имеет вид: .
Начальные условия следует задать: y[1]:=2a; y[2]:=exp(a);.
Сравнивая полученное решение с точным решением, добиваться того, чтобы погрешность на втором конце (x=b) была не больше 0.0001.
N |
|
|
[a, b] |
U1(a) |
u2(a) |
ме-тод |
5 |
|
|
[2,4] |
4 |
|
M5 |
Программа для решения задачи Коши приведена в листинге 6.1.
Результаты работы программы приведены на рис. 6.1.
Листинг 6.1
// Ganisevsky6_M5.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
void OUT(double x,double y21,double y22)
{
double u[2]={(2*2),pow(2.718,2)};
cout << x << fixed <<setprecision(3)<< "\t"<< y21 << "\t" << 2*2 << "\t"<<fabs(y21-2*2)<< "\t" << y22 << "\t" << exp(2.0) << "\t"<<fabs(y22-exp(2.0))<<endl;
}
double FPR1(double x1, double y11, double y12)
{
return 2*y11+(y12+pow(2.718,x1))/pow(2.718,x1)-4*x1;
}
double FPR2(double x2, double y211, double y212)
{
return 2*x2*y212/y211;
}
int main()
{
int i,n;
double h,x,eps,ny,a=2,b=4,nx,np;
double y[3];
double yp[3];
double ypp[3];
double yppp[3];
double yx[3];
double f[3];
double fp[3];
double fpp[3];
double fppp[3];
np=0;
ny=2;
nx=20;
y[1]=4;
y[2]=exp(2.0);
eps=0.0001;
do
{
h=(b-a)/nx;
x=a;
if(np!=0)
{
cout << "x " <<"\ty1 " << "\tu1 " << "\tD1 "<<"\ty2" << "\tu2 " << "\tD2 "<<endl;
OUT(x,y[1],y[2]);
}
else
{
np=nx+1;
}
for(n=1;n<=nx;n++)
{
f[1]=FPR1(x,y[1],y[2]);
f[2]=FPR2(x,y[1],y[2]);
for(i=1;i<=ny;i++)
{
yp[i]=y[i]+(h/2)*f[i];
}
x=x+h/2;
fp[1]=FPR1(x,yp[1],yp[2]);
fp[2]=FPR2(x,yp[1],yp[2]);
for(i=1;i<=ny;i++)
{
ypp[i]=yp[i]+(h/2)*f[i];
}
x=x+h/2;
fpp[1]=FPR1(x,ypp[1],ypp[2]);
fpp[2]=FPR2(x,ypp[1],ypp[2]);
for(i=1;i<=ny;i++)
{
yppp[i]=ypp[i]+h*f[i];
}
x=x+h/2;
fppp[1]=FPR1(x,yppp[1],yppp[2]);
fppp[2]=FPR2(x,yppp[1],yppp[2]);
for(i=1;i<=ny;i++)
{
yx[i]=yppp[i]+(h/6)*(f[i]+2*fp[i]+2*fpp[i]+fppp[i]);
}
if(fmod(n,np)==0)
{
cout << "x " <<"\ty1 " << "\tu1 " << "\tD1 "<<"\ty2" << "\tu2 " << "\tD2 "<<endl;
OUT(x,yx[1],yx[2]);
}
}
nx=nx*2;
}
while(h>eps);
return 0;
}
Рис. 6.1