#python #function #attributes #attributeerror
#python #функция #атрибуты #attributeerror
Вопрос:
def solveNLEs(xyz0):
def f(xyz):
x=xyz[0]
y=xyz[1]
z=xyz[2]
a=x**2 y**2 - 10
b=x*y y*z**2 15
c=y**2 z - 25
return np.array([a,b,c])
xyz=fsolve(f,xyz0)
x=xyz[0]
y=xyz[1]
z=xyz[2]
return [x,y,z, f(xyz)]
print(np.round(solveNLEs(np.array([2,2,2])),5))
это просто простая функция для решения набора нелинейных уравнений, она работает, однако, когда я пытаюсь округлить ответ, я получаю эту ошибку. Я знаю, что мне нужно изменить тип моего ответа, но я не уверен, как это сделать, попытка использовать dtype=float или .atype просто выдает другие ошибки
«цикл ufunc не поддерживает аргумент 0 типа numpy.float64, у которого нет вызываемого метода rint» это точное сообщение об ошибке, которое появляется
Комментарии:
1. Откуда вы получаете функцию fsolve? scipy?
2. да, в начале не указано решение для импорта из scipy
Ответ №1:
Кажется, это просто округление вложенного массива, которое вызывает проблему. Вместо этого вы могли бы выполнить округление внутри самих функций для отдельных элементов.
from scipy.optimize import fsolve
import numpy as np
def f(xyz):
x = xyz[0]
y = xyz[1]
z = xyz[2]
a = x**2 y**2 - 10
b = x*y y*z**2 15
c = y**2 z - 25
a = np.round(a, 5)
b = np.round(b, 5)
c = np.round(c, 5)
return np.array([a, b, c])
def solve_nles(xyz0):
xyz = fsolve(f, xyz0)
x = xyz[0]
y = xyz[1]
z = xyz[2]
x = np.round(x, 5)
y = np.round(y, 5)
z = np.round(z, 5)
return [x, y, z, f(xyz)]
print(solve_nles(np.array([2, 2, 2])))
Примечание: вам также не нужно создавать функции внутри функций, которые их используют, они доступны для всех методов после определения.
Комментарии:
1. Не понял, что касается функций, спасибо, подумал, что это выглядит немного странно. Однако я не могу просто округлить числа внутри функции, поскольку это тестовый код, который округляет ответы. Я просто использовал функцию print внизу, чтобы проверить, будет ли она округляться. Тестовый код для этой функции « answer = solveNLEs(np.array([2,2,2])) print(np.round(ответ, 5)) ` `
2. Но, как я уже указывал, вы не можете округлить вложенный список (список с массивом внутри него). Вам нужно будет написать дополнительный скрипт для просмотра элементов в этом списке и округления их по отдельности, например
print([ np.round(elem, 2) for elem in answer ])
Ответ №2:
это было решено
from scipy.optimize import fsolve
def solveNLEs(xyz0):
def f(xyz):
x=xyz[0]
y=xyz[1]
z=xyz[2]
a=x**2 y**2 - 10
b=x*y y*z**2 15
c=y**2 z - 25
return np.array([a,b,c])
xyz=fsolve(f,xyz0)
x=xyz[0]
y=xyz[1]
z=xyz[2]
return [np.array([x,y,z]), f(xyz)]
изменив возвращаемое значение на сам массив, он смог работать с тестовым кодом
answer = solveNLEs(np.array([2,2,2]))
print(np.round(answer,5))