You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SymPy推导X与Y的关系并绘制Y关于X的函数图像

How to Plot Y as a Function of X Using SymPy (With Variable Substitution & Simplification)

Hey there! Let's work through this problem step by step—since you're new to SymPy, we'll start with fixing the simplification confusion, then redefine Y in terms of X, and finally plot the result.

1. Fixing SymPy's Simplification Issue

First, let's tackle why your manual cancellation works but SymPy isn't cleaning up the m/k terms. The most common reason is either not explicitly calling SymPy's simplification functions, or not giving SymPy enough hints about your variables (like ensuring they're positive, which helps with square root simplification).

Let's use an example to demonstrate (adjust the Y expression to match your actual function):

from sympy import symbols, sqrt, simplify

# Define symbols with positive=True to help SymPy simplify square roots safely
k, m, ω = symbols('k m ω', positive=True)
X = ω * sqrt(m/k)

# Replace this with your actual Y expression
Y = ω * m / (k * sqrt(m/k))

Now call SymPy's simplify() function—this should mirror your manual calculation by canceling redundant terms:

simplified_Y = simplify(Y)
print(simplified_Y)  # For our example, this outputs sqrt(m*k)

The positive=True flag is key here: SymPy avoids making assumptions about variable signs by default, so telling it your variables are positive lets it simplify aggressively, just like you do by hand.

2. Rewrite Y as a Function of X

To plot Y against X, we need to eliminate ω from Y by substituting it with an expression derived from X.

First, solve for ω using the definition of X:

from sympy import solve

# Isolate ω from X = ω*sqrt(m/k)
ω_in_terms_of_X = solve(X - ω*sqrt(m/k), ω)[0]
print(ω_in_terms_of_X)  # This gives X*sqrt(k/m)

Now substitute this into your original Y expression, then simplify again:

# Replace ω in Y with our new expression
Y_in_X = Y.subs(ω, ω_in_terms_of_X)
# Clean up the result
Y_in_X_simplified = simplify(Y_in_X)
print(Y_in_X_simplified)

At this point, Y will only depend on X and possibly k/m. If k and m are constants (e.g., you have specific values for them), substitute those in to get a pure function of X:

# Example: set k=2, m=8
Y_final = Y_in_X_simplified.subs({k:2, m:8})
print(Y_final)  # Now it's a function of only X!

3. Plot Y(X)

Once you have Y as a function of X, plotting is straightforward with SymPy's built-in tools, or you can use Matplotlib for more customization.

Option 1: SymPy's Built-in Plot

from sympy import plot

# Plot over a range of X values (adjust the interval to fit your needs)
plot(Y_final, (X, 0, 10), xlabel='X', ylabel='Y', title='Y vs X')

Option 2: Matplotlib for Customization

If you want more control over the plot (like adding grids, legends, or multiple lines), convert the SymPy expression to a numerical function with lambdify:

import matplotlib.pyplot as plt
import numpy as np

# Convert SymPy expression to a NumPy-compatible function
f = lambdify(X, Y_final, 'numpy')

# Generate X values
x_vals = np.linspace(0, 10, 100)
# Calculate corresponding Y values
y_vals = f(x_vals)

# Plot with Matplotlib
plt.plot(x_vals, y_vals)
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Y vs X')
plt.grid(True)
plt.show()

Quick Troubleshooting

  • If simplification still isn't working, double-check your Y expression for typos (e.g., make sure sqrt(m/k) is written correctly instead of sqrt(m)/k).
  • If k and m are variables (not constants), you'll need to fix one of them to plot Y against X (e.g., set k=1 and plot multiple lines for different m values).

内容的提问来源于stack exchange,提问作者zsmlqlj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:27:27