我正在尝试在MATLAB中创建一个程序,我们必须在其中找到最大值。 我使用的算法是将给定点与两个相邻点进行比较。 如果下一个点大于当前值,则以正方向迭代。 如果下一个点小于当前值,则沿负方向迭代。 如果前一个点和下一个点小于当前点,则达到最大值。
我用flag变量做了一个while循环。但是它无法检测到最大值。
我将x初始化为某个数字(比如x = 0) 函数'f(x)= -x ^ 2 -3;' 变量'xint'是设置为0.1的区间。 变量'i'只是为了保持计数。
clc
clear all
syms x
f(x) = -x^2+3;
max = 0;
x = 0;
xint = 0.1;
flag =1;
while(flag ==1)
fprintf('\ninside while\n')
if(f(x+xint)> f(x))
x = x + xint;
fprintf('inside first: Value of x is set to = %f, where function value is %f', x, f(x));
elseif(f(x+xint) < f(x))
x = x-xint;
fprintf('inside second: Value of x is set to = %f, where function value is %f', x, f(x));
else if(f(x-xint)<f(x) & f(x+xint) < f(x))
disp('Max detected')
max = x;
flag =0;
end
i = i+1;
end
任何帮助对我都有用。
非常感谢你。
阿努邦
输入: f(x)= -x ^ 2 + 3;
输出: 该程序不会进入第三个else if语句。因此while循环继续运行。
答案 0 :(得分:0)
您不能拥有else
条款的条件。另外,如果你要将else
变为elseif
,那么当你在前一个elseif
的条件为真时,你所写的条件是真的,那么它是无法到达的,但在if-elseif语句中,每次只执行一个子句。
更改elseif
的条件并获取else
的条件:
elseif(f(x-xint) > f(x))
x = x-xint;
fprintf('inside second: Value of x is set to = %f, where function value is %f', x, f(x));
else
disp('Max detected')
max = x;
flag =0;
end
答案 1 :(得分:0)
我假设xint是一个正值,你的函数是二阶polinomial,负常数(i.e. y = a*x^2+b where a < 0)
,然后:
if f(x+xint) > f(x) % go to right.
x1 = x+xint;
else % go to left
x1 = x
xint = -xint;
end
while f(x1) > f(x1+xint)
x1 = x1+xint;
end
这里x1是最大值或非常接近它的东西。