显然长宽相等,否则可使用更少的材料制造出相同容积的箱盒
记边长为x,高y
则x^2 y=100, y>=5;
材料 f(x,y)=4xy+x^2=400/x+x^2
因x不大于根号20,上述值在x取根号20时 最小 ,此时y等于5
建议用解非线性方程组的方法求解,fsolve()函数,先设定初值,知道解的大致的范围后,再以此值为初值,在设定的精度下求解。
用matlab解一道复杂的多元非线性方程组;
参考如下:
建立
Myfunm
文件
function
F
=
myfun(x,a)
E
=
a(1);
I
=
a(2);
R0
=
a(3);
R1
=
a(4);
T
=
a(5);
A
=
a(6);
v
=
a(7);
rho
=
a(8);
F
=
[
(T
-
rho
A
v^2)
sin(x(3))
x(1)
-
(T
cos(x(3))
+
rho
A
v^2
-
rho
A
v^2
cos(x(3)))
x(2)
-
EI/(R0
+
R1);
(1/3)
(T
-
rho
A
v^2)
sin(x(3))
x(1)^3
-
(1/2)
(T
cos(x(3))
+
rho
A
v^2
-
rho
A
v^2
cos(x(3)))
x(2)
x(1)^2
-
E
I
x(2);
(T
-
rho
A
v^2)
sin(x(3))
x(1)^2
-
(T
cos(x(3))
+
rho
A
v^2
-
rho
A
v^2
cos(x(3)))
x(2)
x(1)
-
E
I
x(3)];
建立一个执行文件
clc
clear
a
=
zeros(8);
display('#
Pls
input
the
known
parameters:
#')
a(1)
=
input('E
=
');
a(2)
=
input('I
=
');
a(3)
=
input('R0
=
');
a(4)
=
input('R1
=
');
a(5)
=
input('T
=
');
a(6)
=
input('A
=
');
a(7)
=
input('v
=
');
a(8)
=
input('rho
=
');
display('#
Pls
input
the
initial
point:
#')
x0
=
zeros(3);
%
Make
a
starting
guess
at
the
solution
x0(1)
=
input('x1
=
');
x0(2)
=
input('y1
=
');
x0(3)
=
input('phi
=
');
options
=
optimset('Display','iter');
%
Option
to
display
output
[x,fval]
=
fsolve(@(x)
myfun(x,a),x0,options)
%
Call
solver
运行,输入已知的几个参数,再输入初始搜索点,即可。
这是二次规划,用quadprog函数解决。不过要首先把目标函数前加负号,然后写成标准的二次型样式。这是因为quadprog求解的是最小值。
先直接定义x1=50:500;x2=50:500;x3=50:500;x4=50:500;x5=50:500,然后定义y=284213+162x1-489x2-579x3
+328x4-220x5+0001x1^2+0003x2^2+0004x3^2+0003x4^2+0001x5^2-0004x1x2-00008x1x3+0004x1x4
-0001x1x5+0008x2x3-0003x2x4+0004x2x5-0008x3x4+00008x3x5-0004x4x5此处请注意,x1,x2,x3,x4,x5之间的互乘和自身的2次方均用用“ ”,即点乘最后,max(y),即可得出最大值。
注意:
“变量”不同于“未知数”,不能说“二次函数是指未知数的最高次数为二次的多项式函数”。“未知数”只是一个数(具体值未知,但是只取一个值),“变量”可在一定范围内任意取值。
在方程中适用“未知数”的概念(函数方程、微分方程中是未知函数,但不论是未知数还是未知函数,一般都表示一个数或函数——也会遇到特殊情况),但是函数中的字母表示的是变量,意义已经有所不同。从函数的定义也可看出二者的差别。
用线性规划可以解决这个问题
不过你的问题只有函数和上下限,太简单了
观察都可以知道,n1取最大,n2,n4取最小的时候,函数最小
如果要编程解决,就可以用线性规划,首先y的常数项首先可以忽略
我们考虑yy=-2760×n1+23278×n2+5938×n4的最小值
>>f=[-2760 23278 5938];%线性系数
>>lb=[0 0 0];%下限
>>ub=[10 15 10];上限
>>n=linprog(f,[],[],[],[],lb,ub)
n =
100000
00000
00000
返回的意思是说 n1=10,n2=0,n4=0时能取到最小
这时候y最小值
>> ymin=fn+1064
ymin =
7880000
function y = f(x1,x2,x3);
if(x1>x2)
if(x1>x3)
y=x1;
else
y=x3;
end
else if(x2>x3)
y=x2;
else
y=x3;
end
end
差不多应该是这样,这种比较大小的写法很多。可以自己写逻辑。
然后存成fm就应该可以调用了。
用 max = f(1,2,3); 应该可以得到 max = 3
不好意思,没有拿matlab跑一下。有问题再说
刚才跑了一下,应该没有问题的。就是逻辑你可以自己修改。
>> fun = @(x) (sqrt((13-2x(1)-x(2))^2+15^2)+x(1))72+272sqrt(x(2)^2+25);
>> x0 = [4,4];
>> op = optimset('Algorithm','interior-point');
>> [x,w] = fmincon(fun,x0,[],[],[],[],[0,0],[8,8],[],op)
x =
18361 06676
w =
2751343
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)