簡體   English   中英

用sympy中的參數替換數字

[英]Replacing numbers with parameters in sympy

我有一些形式的 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 有沒有辦法做到這一點? 謝謝!

這有點棘手,因為您說“所有數字”但您忽略了指數。 在您的示例中,您只是用新符號替換術語中的數字因子 要做到這一點(並讓您找到可能的解決方案),請嘗試使用replace ,告訴它您正在尋找一個 Mul,然后告訴它您想用它做什么:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM