Как я могу решить для двух уравнений, которые равны друг другу, когда у меня есть одно неизвестное, используя Python? - PullRequest
0 голосов
/ 04 февраля 2020

Image of the equation

Все константы известны, кроме Ts2. Я хочу выполнить итерацию для нескольких значений r2, но я также хочу знать, чему равна любая из сторон уравнения. Как бы я go решил что-то подобное в Python?

Небольшая заметка, не уверен, что это важно, но знаменатель правой стороны должен быть в отрицательной степени 1.

Я посмотрел на fsolve в scipy, но не понимаю, как бы я go написал о написании кода.

Редактировать: я получил ошибку при попытке использовать этот метод. Вот мой код:

def f(ts2, r2):
    e = 0.2
    ts1 = 90
    r1 = 0.25
    o = 5.67 * 10 ** -8
    k = 0.00016
    tsur = 298
    lhand = (ts2 - ts1) / ((1 / (4 * np.pi * k)) * ((1 / r1) - (1 / r2)))
    rhand = (tsur - ts2) / (4 * np.pi * r2 * r2 * (e * o * (ts2 + tsur) * (ts2 * ts2 + tsur * tsur))) ** -1
    return lhand - rhand


rvalues = np.linspace(0.251, 0.3, num=50)
y = np.zeros_like(rvalues)
i = 0

for ele in rvalues:
    y[i] = fsolve(f, 280., args=[ele, ]) # Here it says: Expected type ndarray got float instead.
    i += 1

код в блоке - это, в основном, вся программа, в которой пропущены операции импорта и некоторые строки pyplot. редактировать: полное сообщение об ошибке:

Traceback (most recent call last):
  File "C:/Users/djoha/OneDrive/Dokumenter/Skole/Python/Vår20/Varme/Øving4/1b.py", line 23, in <module>
    y[i] = fsolve(f, 280., args=[ele, ])
  File "C:\Users\djoha\OneDrive\Dokumenter\Skole\Python\venv\lib\site-packages\scipy\optimize\minpack.py", line 147, in fsolve
    res = _root_hybr(func, x0, args, jac=fprime, **options)
  File "C:\Users\djoha\OneDrive\Dokumenter\Skole\Python\venv\lib\site-packages\scipy\optimize\minpack.py", line 213, in _root_hybr
    shape, dtype = _check_func('fsolve', 'func', func, x0, args, n, (n,))
  File "C:\Users\djoha\OneDrive\Dokumenter\Skole\Python\venv\lib\site-packages\scipy\optimize\minpack.py", line 26, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
  File "C:/Users/djoha/OneDrive/Dokumenter/Skole/Python/Vår20/Varme/Øving4/1b.py", line 13, in f
    lhand = (ts2 - ts1) / ((1 / (4 * np.pi * k)) * ((1 / r1) - (1 / r2)))
TypeError: unsupported operand type(s) for /: 'int' and 'list'

1 Ответ

0 голосов
/ 04 февраля 2020

Рассмотрим следующий упрощенный пример:

from scipy.optimize import fsolve

def f(x):
    return x-1

print(fsolve(f, .5)) # Prints out "[1.]"

В этом примере есть функция f(x) = x - 1. Вызов fsolve принимает эту функцию и отправную точку и находит, где она равна 0 (обратите внимание, что я выбрал начальную точку 0,5, но вы можете выбрать много разных начальных точек и получить тот же результат).

Таким образом, ответ состоит в том, чтобы просто переписать ваше уравнение как эквивалентное 0 и использовать fsolve для решения для Ts2.

Редактировать:

Я не знаю, какие значения по умолчанию вы хотите используйте для ts1, tsur, et c ... но вы, вероятно, хотите примерно следующую функцию:

from scipy.optimize import fsolve

def f(ts2):
    # Define tsur, r2, etc... here!
    lhand = (ts2-ts1)/((1/(4*pi*k))*(1/r1-1/r2))
    rhand = (tsur-ts2)/(4*pi*r2*r2*(e*o*(ts2+tsur)*(ts*ts+tsur*tsur)))**-1
    return lhand-rhand

print(fsolve(f, .5))

Edit 2:

Если вы хотите включить больше параметров, то fsolve функция принимает необязательный аргумент args, который принимает список. В этом случае я добавил дополнительный аргумент 'y'.

from scipy.optimize import fsolve

def f(x, y):
    return x+y

for y in range(10):
    print(fsolve(f, .5, args=[y,]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...