Parameters 用Mathematica求函数的极小值

Parameters 用Mathematica求函数的极小值,parameters,wolfram-mathematica,implicit,test-data,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,

我通过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}]
有适当的结果。然而,我的实际函数更复杂,由一些指数为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.}. >>
函数值{3.74166(-2.+81.(256.Power[]+256.Power[]+256.Power[])(Times[]+Times[]^4)^2}不是在{apb3d,bpb3d,cpb3d,fpb3d,gpb3d,hpb3d}={1,1,1,1}处具有{1}维度的实数列表。>>

我想要拟合的函数在x为0到90的区域中,而y在0到2之间。然而,由于它是一系列的正弦函数,拟合函数是对称的,我想要拟合的参数在-2和2之间。已使用已知的参数值进行了一些测试,因此实际功能是正确的。Mathematica是否需要一些进一步的输入,以将参数搜索限制在哪里?

更准确地说,我添加了我想要拟合的函数。 源自:

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}];

谢谢你提供了你所要做的一切细节。这对于得到一个你可以使用的答案至关重要

如果我对此进行评估的话,尽量精确地跟踪错误

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]

然后我看到所有的x,y,z都被nYoFIT3D112212的系数替换了

那么这个

fittning=FindMinimum[
  Total[Map[(phib3d-2)^2/.{x->#[[1]],y->#[[2]],z->#[[3]]}&,nYoFIT3D112212]], parameter]
不再抱怨没有成为{Real}的列表


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

因为错误消息说,当{apb3d、bpb3d、cpb3d、fpb3d、gpb3d、hpb3d}={1,1,1,1,1}尝试您的函数时,您的函数不是真实的。{apb3d->1.,bpb3d->1.,cpb3d->1.,fpb3d->1.,gpb3d->1.,hpb3d->1.}看看结果是什么。你可以在
findminium
参数上指定约束。在文档中有几个例子。当我插入apb3d=1的值和其他参数时,我的函数看起来就像它应该的一样。但是我得到了一些小的“波”在我的函数中,当我在另一个prorgam(例如Excel)中绘制函数时,它不会出现。因为您显示的错误消息表明结果不是{somerealnumber}当您进行这些替换时,我试图让您找出与{somerealnumber}不同的结果我希望这会给你指出问题所在。没有关于函数的更多信息,除了你的一般陈述,很难提供更多帮助。这很好,我需要添加和更改我的测量数据,但这根本不是问题。但是我遇到了另一个关于disp的问题在使用线条时放置我的函数:轮廓图[(Ftest[x,y,z]/.fitting[[2]])==2,{x,0,1.5},{y,0,1.5},{z,0,1.5},Epilog->{Red,Point/@nyoft3d112212}]结果是:“[Ftest[x,y,z]/.\fitting[[2]==2,{x,Point nyoft3d112212}中的位置3以外的预期选项(而不是{z,0,1.5
]),{z,0,1.5
},Epilog->{Red,\Point/@nYoFIT3D112212}]。选项必须是规则或规则列表。“@YaY首先,轮廓图不接受,{x,0,1.5},{y,0,1.5},{z,0,1.5}”。请阅读ContourPlot的帮助页面,并使您的使用与其中一个示例几乎完全相同。如果这不能解决问题,则绘图函数通常会改变计算方式。我建议使用新名称定义一个完整的完成函数,然后将该函数交给绘图,而不是尝试在然后,您可以尝试使用Show将您的绘图与Graphics3D[Point/@nyofit3d1122]结合起来,再次尝试避免绘图中的评估问题
fittning=FindMinimum[
  Total[Map[(phib3d-2)^2/.{x->#[[1]],y->#[[2]],z->#[[3]]}&,nYoFIT3D112212]], parameter]