Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование метода градиентного спуска - проверка кода на корректность - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Разбить файл на части http://www.cyberforum.ru/cpp-beginners/thread90343.html
вот недавно изучил тему про fstream такая задача, нужно разбить файл на столько частей на сколько пожелает пользователь. к примеру на 10 fstream f("f.txt",ios::in); f.seekg(0,ios_base::end);...
C++ Переписать символы из файла в файл при считывании из файла(in) , символы выводятся в консоль, а как сделать чтобы они записывались в другой файл(out) а не в консоль?? int main() { ifstream input("in.txt"); ofstream... http://www.cyberforum.ru/cpp-beginners/thread90288.html
Поправьте код... C++
Помогите поправить код...не пойму в чем ошибка....программы разложения в ряд ln(x+1) #include "iostream" #include "stdafx.h" #include <conio.h> #include <stdio.h> #include <windows.h> #include...
C++ Определить, какая из фигур имеет большую площадь
1) в стене существует квадратное отверстие N на N см. Имеется кирпич с измерениями a,b,c. определить пройдёт ли он в отверстие или нет. если подавать его можно параллельно стенкам отверстия. 2)...
C++ Замена символа пробела на заданную строку http://www.cyberforum.ru/cpp-beginners/thread90258.html
здрасти, со строками у меня как то плохо все, как заменить все символы пробелов на строку " !##! "? int main() { char probel = ' '; char Buf; FILE *file; file = fopen("in.txt", "w");...
C++ Карточная игра из книги Лафоре помогите плиз с парой вопросов. заранее спасибо.(2 вопроса в комментариях) // cardaray.cpp // класс игральных карт #include <iostream> #include <cstdlib> #include <ctime> using namespace std; ... подробнее

Показать сообщение отдельно
Artyom
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 10

Программирование метода градиентного спуска - проверка кода на корректность - C++

28.01.2010, 02:36. Просмотров 18990. Ответов 8
Метки (Все метки)

Здравствуйте!
мне необходимо сдать лабораторную работу по методу градиентного спуска. я запрограммировал этот метод поиска минимума функции. работает он корректно и минимум функции находит, но мой преподаватель имеет странную манеру проверять лабы - он задал шаг, кол-во итераций и проверяет по значению функции в заданной точке, сверяя ответ с ответом в своей программе. его ответ и мой значительно отличается, что вряд ли можно объяснить различной разрядностью. я программировал метод четко по алгоритму и сомневаюсь, что у меня есть ошибка в такой маленькой программе, тем более что для функций попроще, чем исследуемая, он работает. помогите доказать преподу, что ошибка в его программе, или укажите, пожалуйста, мне на мою ошибку.
исходные данные:
f(x,y) = y^2+cos(x+1.23*y) //целевая ф-я
x0 = -0,4 //начальное значение х
y0 = 1.9 //начальное значение у
h = 0.002 //шаг
n = 4 //кол-во итераций
ответ препода (значение функции в 4-й точке) = 2,07
мой ответ = 3,22
мой ответ ближе к начальному значению функции (3.25), что по-моему, нормально для такого маленького шага. к тому же я переделал программу, которую нашел в интернете для целевой функции и получил ответ, похожий на свой.
вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <math.h>
#include <conio.h>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
using namespace std;
 
double f(double x, double y)
{
    return  y*y + cos(x + 1.23*y);
};
 
double gradX(double x, double y)
{
    return -sin(x + 1.23*y);
};
 
double gradY(double x, double y)
{
    return  2*y - 1.23*sin(x + 1.23*y);
};
 
double norm(double x, double y)
{
    return sqrt((-sin(x + 1.23*y))*(-sin(x + 1.23*y)) + (2*y - 1.23*sin(x + 1.23*y))*(2*y - 1.23*sin(x + 1.23*y)));
};
 
 
void output(double x, double y)
    {
        cout << setw(4) << fixed << setprecision(5) << x;
        cout << setw(14) << fixed << setprecision(5) << y;
        cout << setw(14) << fixed << setprecision(5) << f(x,y) << endl;
    };
 
void main()
{
    double x0 = -0.4;
    double y0 = 1.9;
    double h = 0.002;
    double M = 6;
    double x = x0;
    double y = y0;
    output(x,y);
    for(int k = 0; k < 4; ++k)
    {   
        double gradx = gradX(x,y);
        double grady = gradY(x,y);
        double Norm = norm(x,y);
        x = x - h*gradx/Norm;
        y = y - h*grady/Norm;
        
        output(x,y);
    };
    _getch();
};
во вложении я прикрепил переделанную чужую программу
0
Вложения
Тип файла: rar Mydoc.rar (963.4 Кб, 680 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.