使用matlab底层文件实现模糊控制算法转载Word文档格式.docx
《使用matlab底层文件实现模糊控制算法转载Word文档格式.docx》由会员分享,可在线阅读,更多相关《使用matlab底层文件实现模糊控制算法转载Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
*
Stand-alone
codes
for
fuzzy
inference
systems.
J.-S.
Roger
Jang,
1994.
Copyright
1994-2002
The
MathWorks,
Inc.
$Revision:
1.12
$
$Date:
2002/06/17
12:
47:
24
$
*/
/*
This
part
is
MACs
only
#if
defined(applec)
||
defined(__MWERKS__)
defined
(THINK_C)
defined(powerc)
#include
<
stdio.h>
stdarg.h>
FILE
*output_file;
#define
PRINTF
macprintf
int
macprintf(char*
format,
...)
{
va_list
arg;
ret;
va_start(arg,
format);
ret
=
vfprintf(output_file,
arg);
va_end(arg);
return(ret);
}
#endif
applec
__MWERKS__
THINK_C
powerc
Start
of
the
regular
fismain.c
这里要改,当然include还是展开,但是我们把它放在vs2008里面,方便管理,还是用.h头文件吧。
"
fis.c"
/***********************************************************************
Main
routine
**********************************************************************/
int
main(int
argc,
char
**argv)
FIS
*fis;
i,
j;
debug
0;
DOUBLE
**dataMatrix,
**fisMatrix,
**outputMatrix;
*fis_file,
*data_file;
data_row_n,
data_col_n,
fis_row_n,
fis_col_n;
这里也要改,读取我们的配置文件——FLC有很多需要选择的参数以及方法
For
data_file
fismain.in"
;
fis_file
fismain.fis"
output_file
fisOpenFile("
fismain.out"
"
w"
);
#else
input
arguments
checking
if
(argc
!
3)
PRINTF("
Usage:
%s
fis_file\n"
argv[0]);
exit
(1);
argv[1];
argv[2];
obtain
data
matrix
and
dataMatrix
returnDataMatrix(data_file,
&
data_col_n);
fisMatrix
returnFismatrix(fis_file,
fis_col_n);
build
structure
fis
(FIS
*)fisCalloc(1,
sizeof(FIS));
fisBuildFisNode(fis,
fisMatrix,
fis_col_n,
MF_POINT_N);
error
(data_col_n
fis->
in_n)
Given
a
%d-input
%d-output
system.\n"
in_n,
out_n);
file
does
not
have
enough
entries.\n"
fisFreeMatrix((void
**)dataMatrix,
data_row_n);
**)fisMatrix,
fis_row_n);
fisFreeFisNode(fis);
fisError("
Exiting
..."
debugging
(debug)
fisPrintData(fis);
create
output
outputMatrix
(DOUBLE
**)fisCreateMatrix(data_row_n,
out_n,
sizeof(DOUBLE));
evaluate
on
each
vector
(i
i
data_row_n;
i++)
getFisOutput(dataMatrix[i],
fis,
outputMatrix[i]);
print
i++)
(j
j
out_n;
j++)
%.12f
outputMatrix[i][j]);
\n"
clean
up
memory
**)outputMatrix,
exit(0);
大致需要改的,就是所指出来得两部分。
很简单的,直接看修改后的代码。
Step3.修改
修改后的main.c
main.c
fis.h"
1;
double
dataMatrixFile.txt"
fisMatrixFile.txt"
从文件读入输入数据矩阵和模糊矩阵,将其放入二维矩阵中*/
建立模糊数据结构*/
/*将fisMatrix中的数据导入到fis中*/
错误检测*/
printf("
fisDebugging
调试数据输出*/
创建输出矩阵5x1*/
(double
sizeof(double));
获取输入->
开始模糊推理->
输出矩阵*/
得到输出并打印*/
清理内存*/
getchar();
return
当然还有我们的fis.h
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#ifndef
__FIS_H__
#
define
stdlib.h>
string.h>
math.h>
Macros
definitions
Define
portable
printf
defined(MATLAB_MEX_FILE)
mexPrintf
real_T
#elif
defined(__SIMSTRUC__)
ssPrintf
printf
double
#endif
ABS
ABS(x)
(
(x)
>
(0)
?
(x):
(-(x))
MAX
MAX(x,y)
(y)
:
MIN
MIN(x,y)
MF_PARA_N
STR_LEN
500
MF_POINT_N
macros
PRINT(expr)
printf(#expr
%g\n"
(DOUBLE)expr)
PRINTMAT(mat,m,n)
printf(#mat
fisPrintMatrix(mat,m,n)
FREEMAT(mat,m)
Free
#mat
...\n"
fisFreeMatrix(mat,m)
FREEARRAY(array)
#array
free(array)
(defined(MATLAB_MEX_FILE)
defined(__SIMSTRUC__))
FREE
mxFree
free
FREE(array)
Data
types
typedef
struct
fis_node
handle;
load_param;
name[STR_LEN];
type[STR_LEN];
andMethod[STR_LEN];
orMethod[STR_LEN];
impMethod[STR_LEN];
aggMethod[STR_LEN];
defuzzMethod[STR_LEN];
userDefinedAnd;
userDefinedOr;
userDefinedImp;
userDefinedAgg;
userDefinedDefuzz;
in_n;
rule_n;
**rule_list;
*rule_weight;
*and_or;
AND-OR
indicator
*firing_strength;
*rule_output;
Sugeno:
rules
Mamdani:
constrained
MF
values
io_node
**input;
**output;
(*andFcn)(DOUBLE,
DOUBL