user input string to function
Nico Vogeli
nicco.9537 at gmail.com
Mon Dec 25 12:49:02 EST 2017
Am Montag, 25. Dezember 2017 16:56:19 UTC+1 schrieb Chris Angelico:
> On Tue, Dec 26, 2017 at 2:04 AM, Nico Vogeli <nicco.9537 at gmail.com> wrote:
> > Am Montag, 25. Dezember 2017 15:58:26 UTC+1 schrieb Chris Angelico:
> >> On Tue, Dec 26, 2017 at 1:48 AM, Nico Vogeli <nicco.9537 at gmail.com> wrote:
> >> > Am Montag, 25. Dezember 2017 14:51:21 UTC+1 schrieb Chris Angelico:
> >> >> On Tue, Dec 26, 2017 at 12:36 AM, Nico Vogeli <nicco.9537 at gmail.com> wrote:
> >> >> > Hi everybody. First ad foremost, happy Christmas!
> >> >>
> >> >> Same to you!
> >> >>
> >> >> > I want to let the use input a function (like x**2) and parse it after that through code (for my numeric class)
> >> >> >
> >> >> > def newton(x0, s, s2, tol, n = 20000):
> >> >> > '''
> >> >> > Näherung zur lösung einer Gleichung mit dem Newton-Verfahren
> >> >> > x0 = Startwert
> >> >> > f = zu lösende Funktion
> >> >> > fx = Ableitung der Funktion
> >> >> >
> >> >> > '''
> >> >> > def f(a):
> >> >> > y = s
> >> >> > return y
> >> >> >
> >> >> > def fx(a):
> >> >> > y = s2
> >> >> > return y
> >> >>
> >> >>
> >> >> > newton(2, 3*x**2, 6*x, 0.1, 2)
> >> >> >
> >> >> > I notice that the x is not converted to an integer, because of the x = symplos('x')
> >> >> > But I don't know how I could possibli change the code to work...
> >> >>
> >> >> The easiest way is to pass a *function* to newton(). It'd look like this:
> >> >>
> >> >> def newton(x0, f, fx, tol, n=20000):
> >> >> ... as before, but without the nested functions
> >> >>
> >> >> newton(2, lambda x: 3*x**2, lambda x: 6*x, 0.1, 2)
> >> >>
> >> >> At least, I think that's how you're doing things. Inside the nested
> >> >> functions, you use 'a', but outside, you use 'x'. Are those
> >> >> representing the same concept? If so, the lambda functions given here
> >> >> will have the same effect.
> >> >>
> >> >> Hope that helps!
> >> >>
> >> >> ChrisA
> >> >
> >> > Hi Chris
> >> >
> >> > Thanks very much for your quick response!
> >> > I was in a bit of a rush, so I confused the variables (don't worry, I just messed arround to try different things, the original code was al tidy with the variable).
> >> >
> >> > I tried your input, but now I get another error:
> >> >
> >> >
> >> > File "C:/Users/Nicco ZHAW/Desktop/Test GUI/Test Projekt.py", line 42, in newton
> >> > b = x - f(x)/fx(x)
> >> >
> >> > TypeError: unsupported operand type(s) for /: 'function' and 'function'
> >> >
> >> > This did not occure befor I tried to implement the user input..
> >>
> >> Did you remove the nested functions? The lambda functions completely
> >> replace your "def f(a)" and "def fx(a)" functions.
> >>
> >> ChrisA
> >
> > I am so so sorry!! I just did not know what you meant by sested functions.. :P
>
> No need to apologize! That's why we have two-directional communication
> - I can ask you to clarify, you can ask me to clarify, and we get to a
> solution.
>
> The concept of passing functions around does take some getting used
> to, so there's no shame in not instantly understanding it.
>
> > Thank you so much for helping me! You're great!
> >
> > Cheers and all the best!
>
> My pleasure! Have yourself an awesome holiday season.
>
> ChrisA
Hello again
So, I tried my best, was looking into the eval and exec function, but still no succsess..
Maybe it helps when I provide the code I want to implement:
def newton_verfahren(self):
if self.cB_1.currentText() == 'Newton':
x0 = self.newton_x.text()
f1 = self.func_1.text()
f2 = self.func_2.text()
tol = self.newton_tol.text()
n = self.newton_n.text()
k = Numerik_Funktionen.newton(int(x0), eval(f1), eval(f2),
int(tol), int(n))
k1 = str(k[0])
k2 = str(k[1])
k3 = str(k[2])
self.ausgabe.setText('Startwert -> x0: '+ k1 + "\n" +
'Anzahl Iterationen: ' + k2 +"\n" +
'f(x~): ' + k3)
Notice that cB_1 is a combobox, newton_x, func_1, func_2, newton_tol and newton_n are all QLineEdits.
The code above doesn't work, so I've opend a 'test' file to just play around with the functions.
Withs test, this return a correct value for the two x functions:
from sympy import symbols
x = symbols('x')
f1 = eval(input('ssd '))
f2 = eval(input('fd '))
But now I get and error from the imported module in the line where the abs(f(x)) > tol.
It states that the 'Pow' object is not callable. And now I don't know how to proceed, I can't figure out a way to make the call to the imported module:
x = symbols('x')
def newton(x0, f, fx, tol, n = 20000):
'''
Näherung zur lösung einer Gleichung mit dem Newton-Verfahren
x0 = Startwert
f = zu lösende Funktion
fx = Ableitung der Funktion
'''
x = x0
k = 0
while n > k and abs(f(x)) > tol:
k += 1
x = x - f(x)/fx(x)
print('x', k, '\n', x)
print('Startwert -> x0', '\n', x0)
print('Anzahl Iterationen', '\n', k)
print('f(x~)', '\n', f(x))
print('Näherungswert -> x~', '\n', x)
return x0, k, f(x), x
Regards
Nicco
More information about the Python-list
mailing list