Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2013, 23:12   #1
Наталья20
Новичок
Джуниор
 
Регистрация: 26.02.2013
Сообщений: 1
Вопрос Метод стрельбы хромающий

Всем привет Мне необходимо реализовать метод стрельбы для решения ду 2го порядка, программу я написала на с++(хотя с прогой у меня всегда было туго), дело в том что работает она с ужаснейшей точностью. Ребята, может есть среди вас кто-то, кто сможет подсказать как улучшить точность или же найти возможные ошибки??

Код:
// метод стрельбы.c
#include "stdio.h"
#include "math.h"
#include "iostream"
using namespace std;
const int n = 10000;
// разбиваю ду 2го порядка на систему 1го порядка
double func2(double x, double y, double z)
{
return 6*x;
}
double func1(double x, double y, double z)
{
return z;
}

// Рунге-Кутт для приближения функции

double RK (double y0, double z0, double a, double b, bool met)
{
double k1, k2, k3, k4;
double l1,l2,l3,l4;
double h;
int i;
h = (b-a)/n; // шаг
double x = a; // начальное значение аргумента
double y = y0; // начальное значение функции
double z = z0; // начальное значение производной

for (i = 0; i < n+1; i++)
{

//if (met == 1) cout << x <<" "<< y << " "<< z << endl;

k1 = h*func1(x,y,z);
l1 = h*func2(x,y,z);

k2 = h*func1(x+h/2,y+k1/2,z+l1/2);
l2 = h*func2(x+h/2,y+k1/2,z+l1/2);

k3 = h*func1(x+h/2,y+k2/2,z+l2/2);
l3 = h*func2(x+h/2,y+k2/2,z+l2/2);

k4 = h*func1(x+h,y+k3,z+l3);
l4 = h*func2(x+h,y+k3,z+l3);

x += h;
y += (k1+2*k2+2*k3+k4)/6;
z += (l1+2*l2+2*l3+l4)/6;

}

return y;

}

int main()
{
freopen("data.txt", "r", stdin);//нач приближение считываю с файлика
freopen("result.txt", "w", stdout);

double a = 0.0;// левая граница отрезка
double b = 1.0;// правая граница отрезка

double ya = 0.0;//краевое условие на левой границе
double yb = 1.0;//краевое условие на правой границе

double alpha0;//начальное приближение уравнения(имеется ввиду конечное
//алгебраическое уравнение для решения задачи методом стрельбы)

double alpha1 = 0.0;
double Falpha0, dFalpha0;

double eps = 0.000001, delta, dh = 0.001;
bool met = 0;

cin>>alpha0;
// Метод стрельбы соответственно
do
{

Falpha0 = RK(ya,alpha0,a,b,met)-yb;

dFalpha0 = (RK(ya,(alpha0+eps),a,b,met)-yb-Falpha0)/eps;

alpha1 = alpha0 - Falpha0/dFalpha0;

alpha0 = alpha1;

delta = fabs(Falpha0);
}
while (delta > eps);

met = 1;


cout <<"alpha = "<< alpha0 <<" Runge(alpha0) = "<< RK(ya,alpha0,a,b,met) <<"\n";


return 0;
}
Наталья20 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Звук стрельбы Abuhamed JavaScript, Ajax 1 02.03.2012 23:00
Вопрос: Параллельные алгоритмы. Реализация стрельбы. MooNDeaR Gamedev - cоздание игр: Unity, OpenGL, DirectX 23 06.08.2011 16:04
Численные методы. Метод Стрельбы (Делфи) s1z0n Помощь студентам 1 23.04.2010 15:37
краевая задача диф.уравнения методом стрельбы Laplas Помощь студентам 2 26.12.2009 23:56
Задача на оценку эффективности стрельбы Борзов Помощь студентам 3 23.05.2007 06:54