Самостоятельно пройдя по строкам, вы не увидите, что происходит, вы должны разобрать утверждение, которое доставляет вам неприятности: в данном случае Show[p1, p2[1,1]
. Сами по себе ни p1
, ни Show
не должны доставлять вам неприятностей, что приводит к выводу, что это должно быть p2[1,1]
. Это подтверждается тем, что запускается сам по себе, что приводит к той же ошибке.
Это приводит к ошибке из-за того, как Plot
, Plot3D
и т. Д. Оценивают аргумент функции. В общем, они по существу делают Replace
для текста функции и могут не расширять вызовы функций. Простое решение - переписать p2
как
p2[x0_, y0_] := Plot3D[Evaluate[p[x, y, x0, y0]], {x, 0, 2}, {y, 0, 2}]
, который избавляется от ошибок. Evaluate
гарантирует, что функция будет оценена символически, прежде чем Plot3D
овладеет ею, избегая любого неправильного обращения. Хотелось бы, чтобы у меня было лучшее представление о том, когда использовать Evaluate
в этих случаях, но если в целом, если вы получаете ошибки от такой функции построения графиков, то, скорее всего, она неправильно обрабатывает функцию.