2013-11-12 7 views
0

Я пытаюсь найти коэффициенты функции, минимизируя уравнение, которое, как я знаю, равно нулю с помощью Mathematica. Мой код:Неймимизировать с численным интегрированием

Clear[f]; 
Clear[g]; 
Clear[GetGood]; 
Clear[int]; 
Clear[xlist]; 
Xmax = 10; 
n = 10; 
dx = Xmax/n; 
xlist = Table[i*dx, {i, n}]; 
A = 3.5; 
slope = (A + 2)/3; 
f[x_, a_, b_, c_, d_, e_] :=a/(1 + b*x + c*x^2 + d*x^3 + e*x^4)^(slope/4 + 2); 
g[x_, a_, b_, c_, d_, e_] :=Derivative[1, 0, 0, 0, 0, 0][f][x, a, b, c, d, e]; 
int[a_?NumericQ, b_?NumericQ, c_?NumericQ, d_?NumericQ, e_?NumericQ] := 
    Module[{ans, i},ans = 0;Do[ans =ans + Quiet[NIntegrate[ 
    y^-slope*(f[Sqrt[xlist[[i]]^2 + y^2 + 2*xlist[[i]]*y*m], a, b, 
     c, d, e] - f[xlist[[i]], a, b, c, d, e]), {m, -1, 1}, {y, 
     10^-8, \[Infinity]}, MaxRecursion -> 30]], {i, 1, 
Length[xlist]}]; 
ans 
]; 
GetGood[a_?NumericQ, b_?NumericQ, c_?NumericQ, d_?NumericQ,e_?NumericQ] := 
    Module[{ans},ans = Abs[Sum[3*f[x, a, b, c, d, e] + x*g[x, a, b, c, d,e], 
     {x,xlist}]+2*Pi*int[a, b, c, d, e]]; 
     ans 
]; 
NMinimize[{GetGood[a, b, c, d, e], a > 0, b > 0, c > 0, d > 0, 
e > 0}, {a, b, c, d, e}] 

Я получаю ошибку после последней строки:

Part::pspec: Part specification i$3002170 is neither an integer nor a list of integers. >> 
NIntegrate::inumr: "The integrand (-(1.84529/(1+<<3>>+0.595769 Part[<<2>>]^4)^2.45833)+1.84529/(1+<<18>> Sqrt[Plus[<<3>>]]+<<1>>+<<1>>+0.595769 Plus[<<3>>]^2)^2.45833)/y^1.83333 has evaluated to non-numerical values for all sampling points in the region with boundaries {{-1,1},{\[Infinity],1.*10^-8}}" 

Любые идеи, почему я получаю сообщение об ошибке?

Благодаря

ответ

0

Изменить NMinimize быть

NMinimize[{GetGood[a,b,c,d,e],a>0&&b>0&&c>0&&d>0&&e>0}, {a,b,c,d,e}] 

, чтобы получить ваши ограничения, чтобы работать правильно. Их страница справки должна действительно показать пример использования более чем одного ограничения. На этой старой странице показан пример.

http://reference.wolfram.com/legacy/v5_2/functions/AdvancedDocumentationNMinimize

Если вы измените ИНТ [], чтобы

int[a_?NumericQ, b_?NumericQ, c_?NumericQ, d_?NumericQ, e_?NumericQ] := 
Module[{ans, i}, ans = 0; Do[ 
Print["First i=", i]; 
ans = ans + Quiet[NIntegrate[ 
    Print["Second i=", i]; 
    y^-slope*(f[Sqrt[xlist[[i]]^2 + y^2 + 2*xlist[[i]]*y*m], a,b,c,d,e] - 
f[xlist[[i]], a,b,c,d,e]), {m,-1,1}, {y,10^-8, \[Infinity]}, MaxRecursion -> 30]], 
{i, 1, Length[xlist]}]; 
ans]; 

вы увидите

First i=1 
Second i=1 
.... 
First i=10 
Second i=i$28850 

где первый отлаживать печать никогда не говорит, что я = я $ нннн но вторая отладка print часто показывает, что я был не назначен значение только внутри вашего NIntegrate, а не за его пределами, и только после того, как я достиг значения 10, длины вашего xlist и при этом po int вы не можете индексировать символ, и вы получаете сообщения об ошибках, которые вы видели.

Ничто внутри вашего NIntegrate не меняет значение i.

Я думаю, вы, возможно, наткнулись на ошибку, где Mathematica пишет над значением i.

Посмотрите, можете ли вы упростить код, не сбивая ошибку. Если вы можете сделать это проще и все еще показать проблему, у вас может быть больше шансов на успех в получении Вольфрама, чтобы признать, что вы нашли ошибку.

+0

Спасибо, я свяжусь с ними – user2982762

 Смежные вопросы

  • Нет связанных вопросов^_^