русский
Germany.ruForen → Архив Досок→ Programmierung

Перспективы для программиста в Германии

28.09.17 20:27
Re: Перспективы для программиста в Германии
 
  ilghiz постоялец
in Antwort AlexNek 28.09.17 16:52

Знакомо, сталкивался.


Смотрите, пусть вы записали вашу функцию как сумму синусов и других функций, пусть это f(x). Наверное в этой функции есть набор параметров, обозначим его как a_1, ..., a_n , где n - число ваших параметров.


Также наверное стоит сказать, что у вас функция состоит из трех кусков, то есть обозначим их f_1(x) (это которая идет из нуля до М) f_2(x) (это которая идет из М до -М) ну и оставшийся кусочек f_3(x).


Далее, вам надобно потребовать

f_1(0)=0,
f_1'(0)=x
f_1(M)=A,
f_1'(M)=0,


f_2(M)=A,
f_2'(M)=0,
f_2(0)=C,
f_2(-D)=0,
f_2(-M)=E,


f_3'(-M)=0,

f_3(H)=0,

f_3(M)=A,


и эти уравнения вы сможете думаю явно записать. Я правда за вас немного додумал по поводу нуля производной f_1'(M)=0, f_3'(-M)=0, ибо посчитал, из картинки, что это вы описываете момент насыщения сердечника катушки в крайних положениях амплитуды тока, если не так, то эти уравнения надо выбросить.


Далее вам надобно решить систему этих уравнений. Очень рекомендую попробовать решить аналитически, то есть найти искомые a_1,..., a_n на основе того, что есть у ват, то есть тех D, H, C, M. Можно для этого использовать пакеты mathematica и maple или хотя бы их триальные или веб версии.


С большой вероятностью вы их не найдете... Тогда надо численно решать. То есть вместо каждого уравнения написать


E = (f_1(0)-0)^2 + (f_1'(0)-x)^2 + ....


и искать минимкум E по a_1,...,a_n


Не бойтесь, это не сложно. Конечно можно использовать Левенберга-Маркварта но если вы им не решили достаточно много других задач, я бы не рекомендовал начинать с него - у вас функция достаточно плохо обусловленная (кривая в простонародье) и вы гарантированно сядете им какой-то экстремум (то есть найдете лажу и будете долго материться).


Есть несколько путей решения.

1. монтекарловка (программируется на раз), но достаточно медленно сходится, в вашем случае считаю, что если вы готовы ждать несколько секунд на ПСшке, то на плохую сходимость можно забить, ибо программируется на раз.

2. методы из BFGS серии, вам для этого надобно будет иметь градиент (производную в точке) E по каждому из ваших параметров. Если осилите посчитать аналитически (должны осилить) далее сам BFGS пишется в 6-7 строк сишника. Елси не осилите, можно прибегнуть к методу Бауэра-Штрассена или его улучшению что я как-то недвано сделал https://arxiv.org/abs/1701.08544 понятно растолкую войсом как один из соавторов.

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


А теперь можно полюбопытстваовать, а вы не пробовали сплайном 3-е степени вашу функцию на трех отрезках записать? Весь вышеуказанный гемор тутже исчезнет и алгоритм будет на одну страницу сишника и устойчивость решения тоже должна быть адекватная. Я чисто из своих соображений это предлагаю, ибо B/H гистерезисы много раз именно так успешно для своих задач описывал.


Ну и если есть реально желание не мучится и быстро решить задачу, контакты моей фирмы на сайте есть, наберите меня, я расскажу как решать, и постораюсь помочь (ессно за так).

 

Sprung zu