решение и оптимизация полиномиального сплайна - PullRequest
0 голосов
/ 14 февраля 2019

Сначала я хотел бы поблагодарить сообщество Mathematica.

У меня есть такая система:

s(x)=
  -2035.5111 + 561.33713 x -51.262777 x^2 + 1.5534175 x^3    x in [10, 11]
  -2035.5111 + 561.33713 x - 51.262777 x^2 + 1.5534175 x^3   x in [11, 12] 
   7158.3214 - 1737.121 x + 140.2754 x^2 - 3.7670874 x^3     x in [12, 13]
  -11037.276 +  2461.863 x - 182.72337 x^2 + 4.5149323 x^3   x in [13, 14]
   9375.4483 - 1912.2922 x + 129.71629 x^2 - 2.9241071 x^3   x in [14, 15]
  -38343.961 + 7035.097 x - 429.49554 x^2 + 8.7261392 x^3    x in [15, 16]
   45546.119 - 7769.0348 x + 441.33575 x^2 - 8.348984 x^3    x in [16, 17]
  -24547.41 + 3913.2201 x - 207.67842 x^2 + 3.6697968 x^3    x in [17, 18]
  -24547.41 + 3913.2201 x - 207.67842 x^2 + 3.6697968 x^3    x in [18, 19]

Как я могу решить систему, m <= s(x) <= M, где m и M не равны нулю и не реальны.

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете сделать это

With[{m=4.5,M=5},
Map[Reduce[#,x]&,
{m<=-2035.5111 + 561.33713 x -51.262777 x^2 + 1.5534175 x^3<=M && 10<=x<=11,
 m<=-2035.5111 + 561.33713 x - 51.262777 x^2 + 1.5534175 x^3<=M && 11<=x<=12,
 m<=7158.3214 - 1737.121 x + 140.2754 x^2 - 3.7670874 x^3<=M && 12<=x<=13,
 m<=-11037.276 +  2461.863 x - 182.72337 x^2 + 4.5149323 x^3<=M && 13<=x<=14,
 m<=9375.4483 - 1912.2922 x + 129.71629 x^2 - 2.9241071 x^3<=M && 14<=x<=15,
 m<=-38343.961 + 7035.097 x - 429.49554 x^2 + 8.7261392 x^3<=M && 15<=x<=16,
 m<=45546.119 - 7769.0348 x + 441.33575 x^2 - 8.348984 x^3<=M && 16<=x<=17,
 m<=-24547.41 + 3913.2201 x - 207.67842 x^2 + 3.6697968 x^3<=M && 17<=x<=18,
 m<=-24547.41 + 3913.2201 x - 207.67842 x^2 + 3.6697968 x^3<=M && 18<=x<=19}
]]

, что даст вам это

{x == 10. || 10.554622537850287<=x<=10.799264882501637,
 False,
 12.437932301023451<=x<=12.565380177021947,
 13.489415750912576<=x<=13.655683693607168,
 14.254978447526584<=x<=14.383489034636659,
 15.243856830113526<=x<=15.265292288384687,
 16.544981470615802<=x<=16.568935210200074,
 17.897288052000384<=x<=18.,
 18.<=x<=18.00034993487379 || 18.49992074750174<=x<=18.64596353629056}

, где каждая строка этого соответствует нулю или более решений с соответствующим уравнением в вашем s (x).

Вы можете сравнить это решение с этим графиком

Show[
Plot[Piecewise[{
{-2035.5111 + 561.33713 x -51.262777 x^2 + 1.5534175 x^3,10<=x<=11},
{ -2035.5111 + 561.33713 x - 51.262777 x^2 + 1.5534175 x^3,11<=x<=12},
{ 7158.3214 - 1737.121 x + 140.2754 x^2 - 3.7670874 x^3,12<=x<=13},
{ -11037.276 +  2461.863 x - 182.72337 x^2 + 4.5149323 x^3,13<=x<=14},
{ 9375.4483 - 1912.2922 x + 129.71629 x^2 - 2.9241071 x^3,14<=x<=15},
{ -38343.961 + 7035.097 x - 429.49554 x^2 + 8.7261392 x^3,15<=x<=16},
{ 45546.119 - 7769.0348 x + 441.33575 x^2 - 8.348984 x^3,16<=x<=17},
{ -24547.41 + 3913.2201 x - 207.67842 x^2 + 3.6697968 x^3,17<=x<=18},
{ -24547.41 + 3913.2201 x - 207.67842 x^2 + 3.6697968 x^3,18<=x<=19}}],{x,10,19}],
Plot[{4.5,5},{x,10,19}]
]

и посмотреть на отрезки между y == 4.5 и y == 5, и оно кажется совпадающим.

В зависимости от того, что вы хотите сделать с этим, можно было бы превратить все это в один дизъюнкт, поместив Or@@ перед With и объединить альтернативы, такие как

17.897288052000384 <= x <= 18. || 18. <= x <= 18.00034993487379

в

17.897288052000384 <= x <= 18.00034993487379

с использованием замены сопоставления с образцом.

Это отображает сообщения о том, что Reduce необходимо превратить ваши десятичные числа в рациональные, чтобы иметь возможность использовать соответствующие алгоритмы, но если это единственные алгоритмысообщения, тогда это должно быть безопасно, чтобы принять те.Все сообщения должны внимательно просматриваться.

Проверьте это очень внимательно, указав фактические значения m и M, чтобы быть абсолютно уверенным, что это правильно.

...