0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 6
1

Ошибка при передаче параметров в функцию. Объясните, ребят, пожалуйста, в чем ошибка

25.11.2015, 17:40. Показов 1186. Ответов 4
Метки нет (Все метки)

Есть функция, которую необходимо отобразить в виде линий уровня. Далее с помощью простого симплекс-метода нужно найти минимальное значение этой функции.

Вот, собственно, сама исходная функция:
Matlab M
1
2
3
4
5
6
7
8
9
function [Z]  = fsimp(a, b)
X = a;
Y = b;
x = -3 : .05 : 3;
[X, Y] = meshgrid(X);
Z=(1.5-X.*(1-Y)).^2+(2.25-X.*(1-Y.^2)).^2;
C = contour(X, Y, Z);
clabel(C);
end
Далее - симплекс-метод (нашла в просторах интернета):

Matlab M
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
58
59
60
61
62
63
64
65
66
function [valFunc, var_min, iter] = simplex(fsimp, init_point, step_size, toll, numMaxIter)
 
% It's a function that finds the minimum value of a two variables objective
% function with a deterministic zero order algorithm: simplex method.
 
% The input variables are:
%-fun: inline function of the objective function
%-init_point: initial point for the simplex method
%-step_size: initial dimension of the simplex
%toll: tolerance for the stop criterion on the simplex dimension
%-numMaxIter: stop criterion on the maximum number of iterations
 
% The output variables are:
%-valFunc: the minumum value of the objective function
%-var_min: the minimum point
%-iter: the number of iteration made
 
%%%%%%%% IMPORTANT %%%%%%%%%%%
% To run correctly the Matlab function, you must run first a contour plot
% of the objective function. You can also view: help countour.
 
iter=0; % Iteration number
N=numMaxIter;   % Max number of iterations (first stop criterion)
tolleranza_passo=toll;  % Tolerance on the simplex dimension (second stop criterion)
passo=step_size;    % Initial step
p0=init_point;  % Initial point. Example: [-5e-6 1e-6]
p=[p0(1,:); p0(1,1)-passo p0(1,2); p0(1,1)-passo/2 p0(1,2)+sqrt(3)/2*passo];    % Vector that contains the three triangle's vertices
plot([p(:,1); p(1,1)], [p(:,2); p(1,2)],'g')    % Plot the initial simplex on the contour plot of objective function
 
while iter<N  && passo>tolleranza_passo
    V=[fsimp(p(1,1),p(1,2)); fsimp(p(2,1),p(2,2)); fsimp(p(3,1),p(3,2))];   % Objective function's values in the simplex's points
    [V_ord, ind]=sort(V);   % Calculates the worst point: p(ind(3)) it is the point to reverse
    V_pegg=V(ind(3));   %Calculating the function in the point of maximum value
    p_ord=p(ind,:);     %Sorts the vector
    p_new=[p_ord(3,1)+2*((p_ord(1,1)+p_ord(2,1))/2-p_ord(3,1)) p_ord(3,2)+2*((p_ord(1,2)+p_ord(2,2))/2-p_ord(3,2))];    % It reverse the worst point
    if fsimp(p_new(1,1),p_new(1,2))<=V_pegg
        p(ind(3),:)=p_new(1,:);     %Checks if the function's value in the new point is smaller than the previous. In the positive case, it saves the new point
        plot([p(:,1); p(1,1)], [p(:,2); p(1,2)],'g')    %Plot the simplex on the contour plot of objective function
        pause(0.5);
    else
        plot([p_ord(1,1); p_ord(2,1); p_new(1,1); p_ord(1,1)],[p_ord(1,2); p_ord(2,2); p_new(1,2); p_ord(1,2)],'--r')   %Plot the worst simplex on the contour plot of objective function
        pause(0.5);
        V_pegg2=V(ind(2));      % If the reversed point returned a worst result, it reverse the second worst point
        p_new=[p_ord(2,1)+2*((p_ord(1,1)+p_ord(3,1))/2-p_ord(2,1)) p_ord(2,2)+2*((p_ord(1,2)+p_ord(3,2))/2-p_ord(2,2))];
        if fsimp(p_new(1,1),p_new(1,2))<=V_pegg2
            p(ind(2),:)=p_new(1,:);
            plot([p(:,1); p(1,1)], [p(:,2); p(1,2)],'g')
            pause(0.5);
        else 
            plot([p_ord(1,1); p_ord(3,1); p_new(1,1); p_ord(1,1)],[p_ord(1,2); p_ord(3,2); p_new(1,2); p_ord(1,2)],'--r')   %Plot the worst simplex on the contour plot of objective function
            pause(0.5);
            % If the first reversed point and the second reversed point
            % returned a worst value, it contracts the simplex
            p=[p_ord(1,1) p_ord(1,2); (p_ord(2,1)-p_ord(1,1))/2+p_ord(1,1) (p_ord(2,2)-p_ord(1,2))/2+p_ord(1,2); (p_ord(3,1)-p_ord(1,1))/2+p_ord(1,1) (p_ord(3,2)-p_ord(1,2))/2+p_ord(1,2)];    
            passo=passo/2;  % Contracts the simplex dimension
            plot([p(:,1); p(1,1)], [p(:,2); p(1,2)],'g')    % Plot the new simplex
            pause(0.5);
        end
    end
    
    % It calculates the output variables
    valFunc=fsimp(p(1,1),p(1,2));
    var_min=[p(1,1), p(1,2)];
    
    iter=iter+1;    % Increases the iterations number
end
При запуске [x,y,i] = simplex(@fsimp, [-2 2], 0.05, 0.01, 1000) возникает ошибка:
??? Undefined function or method 'fsimp' for input
arguments of type 'double'.

Error in ==> simplex at 31
V=[fsimp(p(1,1),p(1,2)); fsimp(p(2,1),p(2,2));
fsimp(p(3,1),p(3,2))]; % Objective function's
values in the simplex's points

Понимаю, что скорее всего ошибка в исходной функции при передаче параметров. Объясните мне, пожалуйста, как передавать массивы/векторы в функцию. Постоянно на этом "спотыкаюсь". Спасибо
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2015, 17:40
Ответы с готовыми решениями:

Ошибка при возведении в степень. В чем дело? Объясните, пожалуйста
Функция возведения в степень: function y = bfunc(x) y = x^2; end Метод деления...

Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и передаче его в функцию?
Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и...

ребят посмотрите пожалуйста в чем ошибка кода
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

Ошибка при передаче параметров
Выбираю путь в переменную path, затем пытаюсь передать эту переменную в качестве параметра в...

4
Эксперт по математике/физике
3365 / 1890 / 569
Регистрация: 09.04.2015
Сообщений: 5,297
26.11.2015, 11:57 2
Когда используешь чужой код, всегда надо очень точно разобраться, какие параметры используются в функции (особенно вызываемой из этого кода).
Судя по использованию внутри
Цитата Сообщение от y_snak Посмотреть сообщение
function [Z] = fsimp(a, b)
команды
Цитата Сообщение от y_snak Посмотреть сообщение
C = contour(X, Y, Z);
моя подсказка может Вам не помочь.

Я абсолютно не уверен (а проверять нет времени), но может вот так
Matlab M
1
2
3
function [Z]  = fsimp(a, b)
Z=(1.5-a.*(1-b)).^2+(2.25-a.*(1-b.^2)).^2;
end
0
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 6
26.11.2015, 22:37  [ТС] 3
SSC, к сожалению, нет, не так. но спасибо
0
Эксперт по математике/физике
3365 / 1890 / 569
Регистрация: 09.04.2015
Сообщений: 5,297
27.11.2015, 09:20 4
Все прекрасно работает. Обязательно файл с функцией должен называться fsimp.m и размещаться в том же каталоге где основная программа.
Функция сложная и находится не совсем точно минимум, но решение движеться в нужную сторону. Время решения достаточно большое

Matlab M
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
58
59
60
61
62
63
64
clc
clear all
 
[X,Y] = meshgrid(-8.5:.1:1,-0.5:.1:2);
Z  = fsimp(X, Y);
[C,h]=contour(X, Y, Z,180);
%set(h,'ShowText','on','TextStep',get(h,'LevelStep')*1)
hold on 
 
init_point=[-2 0.3];
numMaxIter=10000;
step_size=0.2;
toll=0.00001;
 
iter=0; % Iteration number
N=numMaxIter;   % Max number of iterations (first stop criterion)
tolleranza_passo=toll;  % Tolerance on the simplex dimension (second stop criterion)
passo=step_size;    % Initial step
p0=init_point;  % Initial point. Example: [-5e-6 1e-6]
p=[p0(1,:); p0(1,1)-passo p0(1,2); p0(1,1)-passo/2 p0(1,2)+sqrt(3)/2*passo];    % Vector that contains the three triangle's vertices
plot([p(:,1); p(1,1)], [p(:,2); p(1,2)],'g')    % Plot the initial simplex on the contour plot of objective function
hold on 
while iter<N  && passo>tolleranza_passo
    V=[fsimp(p(1,1),p(1,2)); fsimp(p(2,1),p(2,2)); fsimp(p(3,1),p(3,2))];   % Objective function's values in the simplex's points
    [V_ord, ind]=sort(V);   % Calculates the worst point: p(ind(3)) it is the point to reverse
    V_pegg=V(ind(3));   %Calculating the function in the point of maximum value
    p_ord=p(ind,:);     %Sorts the vector
    p_new=[p_ord(3,1)+2*((p_ord(1,1)+p_ord(2,1))/2-p_ord(3,1)) p_ord(3,2)+2*((p_ord(1,2)+p_ord(2,2))/2-p_ord(3,2))];    % It reverse the worst point
    if fsimp(p_new(1,1),p_new(1,2))<=V_pegg
        p(ind(3),:)=p_new(1,:);     %Checks if the function's value in the new point is smaller than the previous. In the positive case, it saves the new point
        plot([p(:,1); p(1,1)], [p(:,2); p(1,2)],'g')    %Plot the simplex on the contour plot of objective function
        %pause(0.05);
    else
        plot([p_ord(1,1); p_ord(2,1); p_new(1,1); p_ord(1,1)],[p_ord(1,2); p_ord(2,2); p_new(1,2); p_ord(1,2)],'--r')   %Plot the worst simplex on the contour plot of objective function
        pause(0.05);
        V_pegg2=V(ind(2));      % If the reversed point returned a worst result, it reverse the second worst point
        p_new=[p_ord(2,1)+2*((p_ord(1,1)+p_ord(3,1))/2-p_ord(2,1)) p_ord(2,2)+2*((p_ord(1,2)+p_ord(3,2))/2-p_ord(2,2))];
        if fsimp(p_new(1,1),p_new(1,2))<=V_pegg2
            p(ind(2),:)=p_new(1,:);
            plot([p(:,1); p(1,1)], [p(:,2); p(1,2)],'g')
            %pause(0.05);
        else 
            plot([p_ord(1,1); p_ord(3,1); p_new(1,1); p_ord(1,1)],[p_ord(1,2); p_ord(3,2); p_new(1,2); p_ord(1,2)],'--r')   %Plot the worst simplex on the contour plot of objective function
            %pause(0.05);
            % If the first reversed point and the second reversed point
            % returned a worst value, it contracts the simplex
            p=[p_ord(1,1) p_ord(1,2); (p_ord(2,1)-p_ord(1,1))/2+p_ord(1,1) (p_ord(2,2)-p_ord(1,2))/2+p_ord(1,2); (p_ord(3,1)-p_ord(1,1))/2+p_ord(1,1) (p_ord(3,2)-p_ord(1,2))/2+p_ord(1,2)];    
            passo=passo/1.5;  % Contracts the simplex dimension
            plot([p(:,1); p(1,1)], [p(:,2); p(1,2)],'g')    % Plot the new simplex
            %pause(0.05);
        end
    end
    
    % It calculates the output variables
    valFunc=fsimp(p(1,1),p(1,2));
    var_min=[p(1,1), p(1,2)];
    
    iter=iter+1;    % Increases the iterations number
end
plot(var_min(1),var_min(2),'b+')
hold off
valFunc
var_min
fsimp(p(1,1), p(1,2))
Программу немного поменял, ну и вывод результатов некрасивый тестовый
0
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 6
27.11.2015, 12:37  [ТС] 5
SSC, действительно - в директории был только asv-файл. Спасибо вам большое. Буду пытаться корректировать вывод
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2015, 12:37

Ошибка при передаче строк в функцию, ошибка при формировании дерева
Курсовой проект, в основе база данных, данные записываются в двоичное дерево. Есть 2 проблемы: 1)...

Ошибка при передаче параметров в подпрограмму
Ошибки появляются при ассемблинге, их обозначил в коде. Помогите пожалуйста. Спасибо. .data f...

Объясните, пожалуйста, в чём ошибка
import stanford.karel.*; public class Task1101_KarelGoesThroughMaze extends SuperKarel {...

В чём моя ошибка, объясните пожалуйста?
Мой код: #include &lt;iostream&gt; using namespace std; double func (int n, int x) { if(n...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru