Замена чисел параметрами в симпы - PullRequest
0 голосов
/ 10 января 2020

У меня есть несколько выражений SymPy вида: 2*x1**2+7*cos(8*x2)+2*Pi (у меня они длиннее и сложнее, но этого должно быть достаточно для моего вопроса). Как я могу превратить все числа, фигурирующие в этом выражении, в параметры, примерно так: a*x1**2+b*cos(c*x2)+d. По сути, у меня есть программа, которая может дать мне приблизительную функцию, способную вместить некоторые данные, но параметры являются целыми числами или некоторыми хорошо известными числами, такими как pi или e (это первое выражение, которое я предоставил). Затем я хочу взять это выражение и точно настроить эти числа (используя градиентный спуск), чтобы получить фактические параметры (можно предположить, что функциональная форма верна, нужно просто настроить параметры). Например, в конце, правильное уравнение может быть: 2.87*x1**2+6.95*cos(8.05*x2)+6.27. Есть ли способ сделать это? Спасибо!

1 Ответ

1 голос
/ 10 января 2020

Это немного сложно, потому что вы говорите «все числа», но игнорируете показатели. В вашем примере вы заменяете только числовые множители в термине новыми символами. Чтобы сделать это (и помочь вам найти возможное решение), попробуйте использовать replace, сообщив, что вы ищете Мул, а затем сообщив, что вы хотите делать с Мулом, когда у вас есть:

from sympy import *
from sympy.abc import x,y

eq=2*x**2+7*cos(8*y)+2*pi

def nfact2dum(m):
    assert m.is_Mul
    nonnum = sift(m.args, lambda i:i.is_number, binary=True)[1]
    return Mul(*([Dummy()] + nonnum))

deq = eq.replace(
    lambda x:x.is_Mul, 
    lambda x: nfact2dum(x))

print(
    deq.subs(list(zip(deq.atoms(Dummy),numbered_symbols('c')))))

output: c0*x**2 + c2*cos(c1*y) + c3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...