使用Mathematica查找函数的最小值

时间:2017-04-05 16:47:08

标签: parameters wolfram-mathematica implicit test-data

我通过Mathematica以这样的方式安装了一些功能

parameter = {a, b};
parameter
data = {{0, 1.2}, {0, 0.1}, {0.1, 0.2}, {1.1, 0}}
Ftest[x_, y_] := a*x^2 + b*y^2
fit = FindMinimum[Total[(Ftest @@@ data - 2)^2], parameter]
ContourPlot[(Ftest[x, y] /. fit[[2]]) == 2, {x, 0, 1.5}, {y, 0, 1.5}, 
Epilog -> {Red, Point /@ data}]

有适当的结果。然而,我的实际功能更复杂,由一个正弦/余弦/ arccos函数组成,有一些指数为8的幂。使用我的实际代码与实际函数我得到一些错误:

The function value {3.74166 (-2.+81. (256. Power[<<2>>]+256. Power[<<2>>]+256. Power[<<2>>]) (Times[<<4>>]+Times[<<2>>])^4)^2} is not a list of real numbers with dimensions {1} at {apb3d,bpb3d,cpb3d,fpb3d,gpb3d,hpb3d} = {1.,1.,1.,1.,1.,1.}. >>

我想要拟合的函数是x为0和90的区域,而y介于0和2之间。但是由于它是一系列正弦函数,拟合函数是符号的。我想要拟合的参数介于值为-2和2.已执行一些已知参数值的测试,因此实际功能正确。 Mathematica是否需要进一步输入限制搜索参数的位置?

2 个答案:

答案 0 :(得分:1)

感谢您提供的所有细节。这对于获得可以使用的答案至关重要。

要尝试非常准确地跟踪错误,如果我评估这个

mpb3d=8; sigxx=x; sigyy=y; sigzz=0; sigxy=z; sigxz=0; sigyz=0;
Ab3d=(sigyy-sigzz)*apb3d; Bb3d=(sigzz-sigxx)*bpb3d;
Cb3d=(sigxx-sigyy)*cpb3d; Fb3d=(sigyz)*fpb3d;
Gb3d=(sigxz)*gpb3d; Hb3d=(sigxy)*hpb3d;
I2b3d=(Fb3d^2+Gb3d^2+Hb3d^2)/3+((Ab3d-Cb3d)^2+(Cb3d-Bb3d)^2+(Bb3d-Ab3d)^2)/54;
I3b3d=((Cb3d-Bb3d)*(Ab3d-Cb3d)*(Bb3d-Ab3d))/54+Fb3d*Gb3d*Hb3d-
  ((Cb3d-Bb3d)*Fb3d^2+(Ab3d-Cb3d)*Gb3d^2+(Bb3d-Ab3d)*Hb3d^2)/6;
thetab3d = ArcCos[I3b3d/((I2b3d)^(3/2))];
phib3d=(3*I2b3d)^(mpb3d/2)*((2*Cos[(2*thetab3d+Pi)/6])^mpb3d +
  (2*Cos[(2*thetab3d-3*Pi)/6])^mpb3d+(-2*Cos[(2*thetab3d+5*Pi)/6])^mpb3d);
nYoFIT3D112212={{-(160/313),160/313,0},{1,0,0},{290/313,21/313, 78/313},
  {236/313,79/313,137/313},{8/17,8/17,152/313},{76/313,227/313,131/313},
  {21/313,294/313,79/313},{0,333/313,0}};
parameter = {apb3d, bpb3d, cpb3d, hpb3d};
Ftest[x_, y_, z_] := phib3d;
Total[(Ftest @@@ nYoFIT3D112212 - 2)^2]

要确切了解您要向FindMinimum提供什么,然后显示

8*(-2+81*(((bpb3d*x+cpb3d*(x-y))^2+(-(bpb3d*x)-apb3d*y)^2+(-(cpb3d*(x-y))+apb3d*y)^2)/54+
  (hpb3d^2*z^2)/3)^4*(256*Cos[(-3*Pi+2*ArcCos[(((bpb3d*x+cpb3d*(x-y))*(-(bpb3d*x)-apb3d*y)*
  etc, etc, etc.

请注意,您的所有x,y,z都保留,并且没有一个被nYoFIT3D112212中的三元组所取代,就像我假设您所期待的那样。

这是我试图让你发现的关键步骤。

可能有几种不同的方法来解决这个问题。一个是如果我替换

Total[(Ftest @@@ nYoFIT3D112212 - 2)^2]

Total[Map[(phib3d-2)^2/.{x->#[[1]],y->#[[2]],z->#[[3]]} &,nYoFIT3D112212]]

然后我确实看到所有的x,y,z都被nYoFIT3D112212中的系数替换。

然后这个

fittning=FindMinimum[
  Total[Map[(phib3d-2)^2/.{x->#[[1]],y->#[[2]],z->#[[3]]}&,nYoFIT3D112212]], parameter]

不再抱怨不是{Real}的列表。

请仔细检查所有这些,以确保在每个步骤中都对x,y,z进行了正确的替换,并且没有其他错误潜伏在我所做的事情中。

答案 1 :(得分:0)

更准确地说,我添加了我想要的功能。 源自:

mpb3d = 8;

sigxx = x;
sigyy = y;
sigzz = 0;
sigxy = z;
sigxz = 0;
sigyz = 0;

Ab3d = (sigyy - sigzz)*apb3d;
Bb3d = (sigzz - sigxx)*bpb3d;
Cb3d = (sigxx - sigyy)*cpb3d;
Fb3d = (sigyz)*fpb3d;
Gb3d = (sigxz)*gpb3d;
Hb3d = (sigxy)*hpb3d;

I2b3d = (Fb3d^2 + Gb3d^2 + Hb3d^2)/
    3 + ((Ab3d - Cb3d)^2 + (Cb3d - Bb3d)^2 + (Bb3d - Ab3d)^2)/54;
I3b3d = ((Cb3d - Bb3d)*(Ab3d - Cb3d)*(Bb3d - Ab3d))/54 + 
   Fb3d*Gb3d*
    Hb3d - ((Cb3d - Bb3d)*Fb3d^2 + (Ab3d - Cb3d)*
       Gb3d^2 + (Bb3d - Ab3d)*Hb3d^2)/6;

thetab3d = ArcCos[I3b3d/((I2b3d)^(3/2))];

phib3d = (3*I2b3d)^(mpb3d/2)*((2*Cos[(2*thetab3d + Pi)/6])^
     mpb3d + (2*Cos[(2*thetab3d - 3*Pi)/6])^
     mpb3d + (-2*Cos[(2*thetab3d + 5*Pi)/6])^mpb3d)

这导致我想要解决的功能为phib3d:

   1 (1/54 ((bpb3d x + cpb3d (x - y))^2 + (-bpb3d x - 
        apb3d y)^2 + (-cpb3d (x - y) + apb3d y)^2) + (hpb3d^2 z^2)/
   3)^4 (256 Cos[
     1/6 (-3 \[Pi] + 
        2 ArcCos[(1/
              54 (bpb3d x + cpb3d (x - y)) (-bpb3d x - 
                apb3d y) (-cpb3d (x - y) + apb3d y) - 
             1/6 hpb3d^2 (-bpb3d x - apb3d y) z^2)/(1/
              54 ((bpb3d x + cpb3d (x - y))^2 + (-bpb3d x - 
                  apb3d y)^2 + (-cpb3d (x - y) + apb3d y)^2) + (
             hpb3d^2 z^2)/3)^(3/2)])]^8 + 
   256 Cos[1/
      6 (\[Pi] + 
        2 ArcCos[(1/
              54 (bpb3d x + cpb3d (x - y)) (-bpb3d x - 
                apb3d y) (-cpb3d (x - y) + apb3d y) - 
             1/6 hpb3d^2 (-bpb3d x - apb3d y) z^2)/(1/
              54 ((bpb3d x + cpb3d (x - y))^2 + (-bpb3d x - 
                  apb3d y)^2 + (-cpb3d (x - y) + apb3d y)^2) + (
             hpb3d^2 z^2)/3)^(3/2)])]^8 + 
   256 Cos[1/
      6 (5 \[Pi] + 
        2 ArcCos[(1/
              54 (bpb3d x + cpb3d (x - y)) (-bpb3d x - 
                apb3d y) (-cpb3d (x - y) + apb3d y) - 
             1/6 hpb3d^2 (-bpb3d x - apb3d y) z^2)/(1/
              54 ((bpb3d x + cpb3d (x - y))^2 + (-bpb3d x - 
                  apb3d y)^2 + (-cpb3d (x - y) + apb3d y)^2) + (
             hpb3d^2 z^2)/3)^(3/2)])]^8)

变量x,y,z(11,22和12方向的应力)和参数apb3d,bpb3d,cpb3d,hpb3d。

拟合数据:

   nYoFIT3D112212 = {{-(160/313), 160/313, 0}, {1, 0, 0}, {290/313, 21/313, 78/313}, {236/
      313, 79/313, 137/313}, {8/17, 8/17, 152/313}, {76/313, 227/313, 131/
      313}, {21/313, 294/313, 79/313}, {0, 333/313, 0}}

我想通过以下方式解决:

parameter = {apb3d, bpb3d, cpb3d, hpb3d};

Ftest[x_, y_, z_] := phib3d

fittning = 
 FindMinimum[Total[(Ftest @@@ nYoFIT3D112212 - 2)^2], parameter]

ContourPlot[(Ftest[x, y, z] /. fittning[[2]]) == 2, {x, 0, 1.5}, {y, 
   0, 1.5}, {z, 0, 1.5}, Epilog -> {Red, Point /@ nYoFIT3D112212}];